我怎样才能查找objective-c的属性@synthesize getter setter代码

时间:2017-12-07 07:59:42

标签: ios objective-c memory-management

在采访中有一个问题“NSMutableArray属性可以使用副本为什么以及为什么不用”我已经搜索了答案,但我想看看auto generate的getter setter代码我该怎么办?

2 个答案:

答案 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和不可变对象类型(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

答案 1 :(得分:0)

你无法真正看到源代码。您可以在Xcode的调试器中进入它,并查看它的汇编程序版本,如果您知道任何平台的汇编程序或者擅长猜测英语单词的缩写,那么它是相当可读的。