我如何查找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和不可变对象类型( NSArrayNSDictionary等)的属性确实有意义,因此如果为可变对象值分配了它的不可变副本,则会阻止属性的值意外更改,例如:

 @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的调试器中进入它,并查看它的汇编程序版本,如果您知道任何平台的汇编程序或擅长猜测英语单词的缩写,则可以相当读取。