iOS开发-面试知识点整理

OK,又到了金三银四的求职跳槽高峰期,先整理一下面试中常见的一些问题的知识点吧,这篇文章会持续更新。

@dynamic与@synthesize的区别

iOS中默认修饰词为@synthesize。

@dynamic修饰的变量表示开发者告知编译器,变量的setter方法和getter方法不需要编译器自动生成,而是开发者自己实现,但是要注意如果在程序运行时,开发者没有实现getter和setter方法,在读取数据或者写入数据时会因为找不到方法导致崩溃的。

@synthesize修饰的变量表示,如果开发者没有自己实现getter方法和setter方法,编译器会帮助开发者来自动加上getter和setter方法。

为什么NSMutableArray(NSMutableDictionary/NSMutableString)不能用copy修饰

因为使用了copy属性之后,当你调用setter方法时,系统会自动copy出一个新的对象,然后释放旧的对象。

比如这段代码:

1
2
3
4
@property (copy) NSMutableArray * a;
NSMutableArray* b = [NSMutableArray array];
a = b;

等同于:

1
2
3
4
@property (strong) NSMutableArray * a;
NSMutableArray* b = [NSMutableArray array];
a = [b copy];

这个时候的a数组实际上是一个NSArray而不是NSMutableArray,所以向他发送一些NSMutableArray的方法比如删除、增加的操作时,就会导致系统找不到方法而崩溃。

参考文档

@dynamic与@synthesize的区别

NSMutableArray copy