Giter Club home page Giter Club logo

iosinterviewquestions's Introduction

ChenYilong 👋

😄 I'm @ChenYilong, living in Auckland, New Zealand, and a programmer who knows a bit about Objective-C, Swift, and Java and has written apps and frameworks.
👯 I'm currently writing some Swift, flutter, and Java code in my spare time at iTeaTime(源码派). Welcome to join the group.
📫 If you want to chat, you can send me an email, direct Twitter DM, and other ways to contact me.
📺 Welcome to fellow my YouTube channel: @iTeaTime Tech | 技术清谈

iosinterviewquestions's People

Contributors

andyden9 avatar bottotl avatar chenyilong avatar codingpub avatar gavin-tang avatar halowang avatar icedrip avatar jrjian avatar liberalisman avatar miracledebris avatar raozhizhen avatar w11p3333 avatar wanyakun avatar wenchaod avatar zhuli8com avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

iosinterviewquestions's Issues

第13题 疑问 对非集合类对象的copy操作

题目中给出的链接:https://www.zybuluo.com/MicroCai/note/50592

NSMutableString *string = [NSMutableString stringWithString: @"origin"];
//copy
NSString *stringCopy = [string copy];
NSMutableString *mStringCopy = [string copy];
NSMutableString *stringMCopy = [string mutableCopy];
//change value
[mStringCopy appendString:@"mm"]; //crash
[string appendString:@" origion!"];
[stringMCopy appendString:@"!!"];

问什么会在这么一行Crash

[mStringCopy appendString:@"mm"]; //crash

根据他得描述,『原因就是 copy 返回的对象是 immutable 对象』, 难道不应该是下面这一行出错吗?

NSMutableString *mStringCopy = [string copy];

copy 返回的是immutable,而所要复制的对象是 mutable.

关于第 34 题关于 NSOperation 中需要手动添加 Autorelease Pool 的部分的疑问

SO 上的这个答案 https://stackoverflow.com/questions/24562043/is-autoreleasepool-still-required-for-modern-ios-8-nsoperation-usage 提到,系统会自动设置好 Autorelease Pool。

这个答案 https://stackoverflow.com/questions/184409/nsautoreleasepool-in-nsoperation-main 提到说需要手动加入 Autorelease Pool,但是答案本身是 08 年的,所引用的苹果官方文档应该也已经更新了(搜不到对应的内容)。

按照我自己的理解,应该是不需要的,因为 NSOperation 所跑的线程也是 Cocoa 创建的线程,Cocoa 创建的线程中应该就已经设置好 Autorelease Pool 了。

按照文档的说法,Operation 里的 Pool 不一定什么时候会进行 drain,所以添加自己的 Pool 会更利于管理。

一个字写错了~

24题.类方法最后一个 (类方法中"不定"直接调用对象方法) 其中"不定"应该是不能吧~

话说第一个答案不严谨

UserSex 是啥?Sex 是啥?如果想表达性别的话应该改成:

typedef NS_ENUM(NSInteger, CYLUserGender) {
    CYLUserGenderUnknown,
    CYLUserGenderMale,
    CYLUserGenderFemale,
    CYLUserGenderNeuter
};

38题__block 内存堆栈问题

 int a = 0;
NSLog(@"定义前:%p", &a);      
void (^foo)(void) = ^{
    NSLog(@"block内部:%p", &a);   
};
NSLog(@"定义后:%p", &a);     
foo();

我按照你的思路,a没加__block 修饰,打印结果按照你判断堆栈的思路,这时候block里面的a也是在堆区,block外面的都是在栈区。那么按道理这里的a值也应该是可以改的啊,毕竟改的是堆区内存。。。

第30题遇到的疑问

如果按照答案的方式解决这个问题.那么请问当scrollView不滑动的时候会触发两次timer的事件,这样也不是理想的效果吧....

34题

34题: 子线程的 runloop 默认是不工作,无法主动创建,必须手动创建。

”必须手动创建“ - 突然发现你是不是打错了,应该是:“必须run their run loop explicitly” ?

Your application does not need to create these objects explicitly; each thread, including the application’s main thread, has an associated run loop object. Only secondary threads need to run their run loop explicitly, however.

see:https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Multithreading/RunLoopManagement/RunLoopManagement.html

第8题,runtime实现weak属性的一点问题

在第8题中,NSObject的类目NSObject (CYLRunAtDealloc)中的方法cyl_runAtDealloc:的属性关联个人觉得有点疏漏:
在这个方法中,初始化CYLBlockExecutor后的属性关联的key采用的是固定的keyrunAtDeallocBlockKey,这样在多个对象同时弱引用另一个对象的时候,导致只能最后一个对象拥有对这个对象的弱引用。所以,我的想法是,这个key可以用动态的值,比如executor的地址:

CYLBlockExecutor *executor = [[CYLBlockExecutor alloc] initWithBlock:block];
const void * key = &executor;
objc_setAssociatedObject(self,
                         key,
                         executor,
                         OBJC_ASSOCIATION_RETAIN);

这样可以避免这个问题。

以上就是我的一点想法,仅供作者参考。

第一题风格纠错

举个栗子:

@property (nonatomic, readonly, getter=isEditable, assign) BOOL editable;

有个非常细节的地方还要注意,property 的权限控制符的从左到右的顺序问题,从人体工程学角度考虑,从左到右应该推荐栗子中这么排列,<<禅与Objective-C编程艺术 >> 这里也有比较详细的解释。。。

第4题

// .h文件
@Property (nonatomic, copy) NSMutableArray *mutableArray;
// .m文件
NSMutableArray *array = [NSMutableArray arrayWithObjects:@1,@2,nil];
self.mutableArray = array;
[self.mutableArray removeObjectAtIndex:0];

因为关键词是copy,所以self.mutableArray是NSArray, 但是array得地址和self.mutableArray的地址是不一样的,有什么方法能让array得地址和self.mutableArray的地址不一样,同时使self.mutableArray是NSMutableArray

上篇第11题,@dynamic那里说明有点问题

@dynamic重点是为了告诉编译器,这个属性的方法在运行时动态提供实现,虽然这也同时表明不需要给这个属性自动生成getter\setter方法,但我觉得后者不是重点,只是附带带来的效果而已。我猜是因为题目是跟@synthesize一起比较,为了凸显区别,所以才导致这么写。

关于第五点问题,如何实现copy

- (id)copyWithZone:(NSZone *)zone {
    CYLUser *copy = [[[self copy] allocWithZone:zone] 
                     initWithName:_name
                                  age:_age
                                  sex:_sex];
    return copy;
}

以上的代码,会造成死循环,因为在copyWithZone方法中调用[self copy]了。
应该改为[[self class] allocWithZone:zone] 吧。

关于weak的一个问题

image

关于这个题,应该不需要探究这么深,比如viewController对self.view是strong引用,view对subviews数组是strong,而数组NSArray对里面的元素也是strong,因此viewController对self.view的所有subview都已经存在strong引用了,因此即使非IB,添加子view也可以weak。跟是否IB没啥关系了

名字太长,不能clone

Demo_25题__objc_msgForward函数是做什么的_直接调用它将会发生什么,这个名字太长了,不能Clone。

关于23点问题。

  1. 使用runtime Associate方法关联的对象,需要在主对象dealloc的时候释放么?
    在ARC下不需要
    在MRC中,对于使用retain或copy策略的需要

MRC下,如果A 关联了B 对象,保证在objc_setAssociatedObject后B对象只有A持有,即B.retainCount = 1的情况下,释放A对象,关联的B对象应该会释放吧。

21题

针对第21题,OC programming language 文档里43页:
Wherever super receives a message, the compiler substitutes another messaging routine for the
objc_msgSend function. The substitute routine looks directly to the superclass of the defining class—that is, to the superclass of the class sending the message to super—rather than to the class of the object receiving the message.

可能是我理解你的文章有误。

FreeRDP 在archiver的时候link .a失败

如题 ,当我在归档操作的时候提示link 失败(null): No such file or directory: '/Users/jzh/Downloads/FreeRDP-master/client/common/Release-iphoneos/libfreerdp-client.a'
感谢您的帮助 谢谢

37 题 block 循环引用问题

ARC 下 __weak 可避免循环引用,__block 不行。 __block 仅在 MRC 下可解决循环引用的问题,但是会有野指针的问题。

第46题,KVO问题

我测试的是先调用willChangeValueForKey: 然后调用的observeValueForKeyPath:ofObject:change:context: ,最后调用的是didChangeValueForKey:

不知道你写那段话是我理解错了还是你写错了.

为什么可能会崩溃?

  • (void)setLastName:(NSString*)lastName
    {
    //设置方法一:如果setter采用是这种方式,就可能引起崩溃
    // if (![lastName isEqualToString:@"陈"])
    // {
    // [NSException raise:NSInvalidArgumentException format:@"姓不是陈"];
    // }
    // _lastName = lastName;

    //设置方法二:如果setter采用是这种方式,就可能引起崩溃
    _lastName = @"陈";
    NSLog(@"🔴类名与方法名:%s(在第%d行),描述:%@", PRETTY_FUNCTION, LINE, @"会调用这个方法,想一下为什么?");

}

set中,对if (_name != name)的描述

set方法中的if (_name != name) 应该只是针对MRC下的retain属性吧
假设传入的参数name和_name为同一指针,在不判断_name != name的情况下,[_name release]后万一内存布局改变,name释放了,[name retain]应该会有问题
只是概率非常非常低,NSString特殊,肯定不会发生这种错误

- (void)setName:(NSString *)name {
    [_name release];  //_name=name,相当于[name release];
    _name = [name retain];
}

第33题,答案可能不是很准确

首先感谢分享~

关于“ARC通过什么方式帮助开发者管理内存”,ARC相对于MRC,不是在编译时添加retain/release/autorelease这么简单。应该是编译期和运行期两部分共同帮助开发者管理内存。

在编译期,ARC用的是更底层的C接口实现的retain/release/autorelease,这样做性能更好,也是为什么不能在ARC环境下手动retain/release/autorelease,同时对同一上下文的同一对象的成对retain/release操作进行优化(即忽略掉不必要的操作);ARC也包含运行期组件,这个地方做的优化比较复杂,但也不能被忽略。

这些内容是参考了《Effective Objective-C 2.0》书中所说,如有冒犯或疏漏还请谅解。

第39题

//我测试了以下,这种方式也会产生循环引用
[[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification"
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification * notification) {
self.someProperty = xyz; }];

//这种方式是不会产生循环引用的
dispatch_group_async(_operationsGroup, _operationsQueue, ^
{
[self doSomething];
[self doSomethingElse];
} );

第38题,外界变量加了__block之后,block内访问这个变量时地址不会变的

__block int a = 0;
NSLog(@"定义前:%p", &a); //栈区
void (^foo)(void) = ^{
a = 1;
NSLog(@"block内部:%p", &a); //堆区
};
NSLog(@"定义后:%p", &a); //堆区
foo();

我的打印结果:
2016-06-14 09:06:30.175 Block的注意事项[3389:2331739] 定义前:0x7fff5fbff7e8
2016-06-14 09:06:30.177 Block的注意事项[3389:2331739] 定义后:0x7fff5fbff7e8
2016-06-14 09:06:30.177 Block的注意事项[3389:2331739] block内部:0x7fff5fbff7e8

__block是地址传递,顾名思义,block内访问外界变量时copy的是地址,而不是再开辟内存空间然后copy内容

硬伤部分

enum 中驼峰命名法和下划线命名法混用错误:枚举类型的命名规则和函数的命名规则相同:命名时使用驼峰命名法,勿使用下划线命名法。

这里函数命名上 《编写高质量iOS与OS X代码的52个有效方法》里说了在私有方法的函数命名上最好加上“p_” 这种表示前缀
请问为何函数的命名不能加下划线呢?

第八题,duplicate symbol error

在任意文件导入
#import "CYLNSObject+RunAtDealloc.h"
将会提示:
duplicate symbol _runAtDeallocBlockKey in:
CYLNSObject+MyRunAtDealloc.o and 导入的文件.o 冲突

第30题,使用dispatch source替换NSTimer

可以不使用nstimer或者cadisplaylink这些需要加入runloop的定时器,使用GCD dispatch source timer替换。而且这个NSRunLoopCommonModes 是合集,也不用先加入default吧,只加入NSRunLoopCommonModes就行。

5题`deepCopy` 代码错误

这段代码有问题, zone 这个变量是从哪来的?

- (id)deepCopy {
    CYLUser *copy = [[[self class] allocWithZone:zone]
                     initWithName:_name
                     age:_age
                     sex:_sex];
    copy->_friends = [[NSMutableSet alloc] initWithSet:_friends
                                             copyItems:YES];
    return copy;
}

个人认为,UserModel还是比起User的命名方式好些

理由:User 这个命名过于简略,用在没有命名空间的的OC语言上容易发生命名冲突。

可以想见,一个叫做CYLUser的类,如果将其实例化的话,其对象名称必然叫做“user”。对于如此简略的名称,我们一般更加习惯是在诸如NSString字符串这样类型的实例上使用。倘若此时同时有一个字符串对象的名称也叫做“user”,两者就会发生很不舒服的命名冲突,而且也不好将其中一个改为另外的名称。
个人认为类名CYLUserModel,实例名称userModel才是更加适合,不易引起其它冲突尴尬的命名方案

同理,对于CYLSex,个人认为
typedef NS_ENUM(NSInteger, CYLSexType) {
CYLSexTypeMan,
CYLSexTypeWoman,
};
才能更容易避免项目之后的尴尬和冲突,并且容易说明这是一个枚举类型。Type和Status理应作为绝大多数枚举类型的通行关键词

第37题有优化

37. 使用block时什么情况会发生引用循环,如何解决?

一个对象中强引用了block,在block中又使用了该对象,就会发射循环引用。 解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用。

id weak weakSelf = self; 或者 weak __typeof(&*self)weakSelf = self该方法可以设置宏
id __block weakSelf = self;

这里有个优化,“一个对象中强引用了block,在block中又使用了该对象”,block出现循环引用是因为双方的强引用导致的,如果有一方不是强应用,都不会出现循环引用的。所以上面一句话应该改成“一个对象中强引用了block,在block中又强引用了该对象”
解决方案还有一种:

打破循环引用,将其中一方强制制空“xxx=nil”。

第8题 有一点说的很容易误导人

原文:
在b非nil时,a和b指向同一个内存地址,在b变nil时,a变nil。此时向a发送消息不会崩溃:在Objective-C中向nil发送消息是安全的。
理解:
__weak someType *a = someInstance;
__weak someType *b = someInstance;
b = nil;
此时a是不会变nil的,
即使执行someInstance = nil;
假如在这之前还有 someType *strongInstance = someInstance;
a也不会变nil,只有当someInstance的引用计数变为0时,那些weak指向它的才会变nil

29

runloop Mode UIApplication.h中有UITrackingRunLoopMode这个

第五个问题set方法的问题

-(void)setSpeed:(int)_speed{
if(_speed < 0) _speed = 0;
if(_speed > 300) _speed = 300;
_speed = speed;
}
上面这个是写错了吧,下面这样才对:

-(void)setSpeed:(int)speed{
if(speed < 0) speed = 0;
if(speed > 300) speed = 300;
_speed = speed;
}

何时出个swift版本 :)

何时出个swift版本 :)
大势所趋,而且swift坑也不少,尤其是各种?!和type casting

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.