最近面试,遇到一些问题?
问题1:
@property(copy)NSMutableArray *array 这种写法会出现什么问题?
用copy来修饰NSMutableArray的类型创建属性
self.mutableArray =[NSMutableArray arrayWithObjects:@"1",@"2",nil];
运行的时候崩溃到下面这句代码
// [self.mutableArray addObject:@"5”];
崩溃结果:
-[__NSArrayI addObject:]: unrecognized selector sent to instance xxxx
总结:被copy修饰的NSMutableArray类型的对象
编译器期间并不会报任何错误
在运行时会报错---调用NSMutableArray里面的方法(比如:addObject:方法),此时NSMutableArray类型转化成NSArray类型
所以报错:unrecognized selector
那么问题来了,为什么创建没有出问题呢?报错的原因?
NSMutableArray 继承于NSArray,创建的方法调用NSArray里面的方法,NSArray类并不能够调用它子类的方法
此时在NSArray并没有实现-addObject:方法,经过系统三次补救机会仍没有找到,最后就崩溃了。
三次补救机会:
(1)、动态方法处理,没有找到实现此方法,
(2)、需要消息转化机制了,继续寻找先转给一个对象处理,并没有任务对象处理,
(3)、然后再继续找最后一次机会,转化一个类来处理,并没有实现处理,结果抛出异常,崩溃了。
附上崩溃的图:
以上个人观点,希望可以互相交流。