Objective-C运行时如何处理类中定义为weak
的属性,但类上的私有类定义了与strong
相同名称和类型的属性?< / p>
在类别的上下文中运行的代码是使用原始(弱)修饰符,还是会使用类别定义修饰符(强)?
例如:
Name.m
@property (weak, nonatomic) NSString *name;
NameTests.m
@interface Name (Test)
@property (strong, nonatomic) NSString *name;
@end
答案 0 :(得分:2)
在属性声明中,weak
仅适用于合成的setter方法(如果有)和合成的实例变量(如果有)。如果这些都没有被合成,则weak
没有效果。
如果合成了setter和instance变量,那么问题是:编译器使用哪个属性声明来合成setter和instance变量?
编译器永远不会合成在命名类别中声明的属性。因此,在您的示例中,name
是一个弱属性。
答案 1 :(得分:0)
在运行时添加具有不明确名称的属性(在使用类别扩展类时会发生这种情况),对于使用哪种方法实现,行为未定义。
这只是一个命名冲突,可以通过为类别方法/属性添加前缀来避免。 Apple的"Programming With Objective-C"指南的“避免类别方法名称冲突”部分中有一些关于前缀的详细信息。
当您构建一个简单的测试项目时,您可能会观察到,运行时随机使用这两个实现中的一个。 (在测试时,请避免使用name属性的常量字符串,因为它们不会暴露行为)
通过使用类扩展而不是命名类别,编译器将生成“非法重新声明属性”错误。