在采访中有一个问题“NSMutableArray属性可以使用副本为什么以及为什么不用”我已经搜索了答案,但我想看看auto generate的getter setter代码我该怎么办?
答案 0 :(得分:3)
您不能仅为汇编程序查看setter的Obj-C代码。要执行此操作,请首先在Xcode中选择包含该属性的源文件,然后选择菜单项Produce > Perform Action > Assemble "File.m"
。这将打开一个包含汇编代码的窗口。搜索setPropertyName:
,其中PropertyName
是您的媒体资本的名称。
这会显示设置者调用_objc_setProperty_nonatomic_copy
或_objc_setProperty_atomic_copy
。要查看那些代码,您需要使用调试器并进入它们。他们基本上只是致电copyWithZone:
。
更重要的是采访问题背后的原因。无论是简单的实验,还是通过上面的汇编程序挖掘,都会显示copy
属性属性总是copy
而不是mutableCopy
。宣言:
@property (nonatomic, copy) NSMutableArray *shouldBeInvalid;
会在理想世界中生成编译器错误。如果为属性分配可变数组值:
self.shouldBeInvalid = @[ @24 ].mutableCopy;
然后由于copy
实际分配的值是不可变数组(NSArray
),与NSMutableArray
声明的类型相矛盾。稍后尝试将属性值用作可变数组:
[self.shouldBeInvalid addObject:@42];
将产生运行时错误,因为属性的值是与其声明的类型相反的不可变对象...
您还会发现编译器很乐意允许您为属性分配不可变数组:
self.shouldBeInvalid = @[ @24 ];
没有警告。
面试官可能正在寻求的是你要解释一下,对于一个属性copy
+可变类型在Objective-C中没有任何意义,因为副本将产生一个不可变的对象值。但是,具有copy
和不可变对象类型(NSArray
,NSDictionary
等)的属性确实有意义,因此如果为可变对象值分配了它的不可变副本,这可以防止财产的价值意外变化,例如:
@property (nonatomic) NSArray *shouldHaveCopy;
NSMutableArray *sample = @[ @"oops" ].mutableCopy;
self.shouldHaveCopy = sample;
[sample addObject:@"'immutable' property changed"];
// self.shouldHaveCopy now references a two element array despite
// its type being `NSArray`
所以一般规则是:
NSMutableDictionary
等)的属性不应指定copy
;和NSArray
具有NSMutableArray
等)时,旨在具有不可变对象值的属性应始终指定copy
。HTH
答案 1 :(得分:0)
你无法真正看到源代码。您可以在Xcode的调试器中进入它,并查看它的汇编程序版本,如果您知道任何平台的汇编程序或者擅长猜测英语单词的缩写,那么它是相当可读的。