我如何查找objective-c的属性@synthesize getter setter代码
在采访中有一个问题“NSMutableArray属性可以使用副本为什么以及为什么不用”我已经搜索了答案,但我想看看auto generate的getter setter代码我该怎么办?
您不能仅为汇编器查看setter的Obj-C代码。 为此,首先在Xcode中选择包含属性的源文件,然后选择菜单项Produce > Perform Action > Assemble "File.m"
。 这将打开一个包含汇编代码的窗口。 搜索setPropertyName:
其中PropertyName
是您的属性的大写名称。
这将显示setter调用_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
你无法真正看到源代码。 您可以在Xcode的调试器中进入它,并查看它的汇编程序版本,如果您知道任何平台的汇编程序或擅长猜测英语单词的缩写,则可以相当读取。