Objective-C属性 - 类别中的强弱声明

时间:2014-07-10 16:06:42

标签: objective-c

Objective-C运行时如何处理类中定义为weak的属性,但类上的私有类定义了与strong相同名称和类型的属性?< / p>

在类别的上下文中运行的代码是使用原始(弱)修饰符,还是会使用类别定义修饰符(强)?

例如:

Name.m

@property (weak, nonatomic) NSString *name;

NameTests.m

@interface Name (Test)
@property (strong, nonatomic) NSString *name;
@end

2 个答案:

答案 0 :(得分:2)

在属性声明中,weak仅适用于合成的setter方法(如果有)和合成的实例变量(如果有)。如果这些都没有被合成,则weak没有效果。

如果合成了setter和instance变量,那么问题是:编译器使用哪个属性声明来合成setter和instance变量?

编译器永远不会合成在命名类别中声明的属性。因此,在您的示例中,name是一个弱属性。

答案 1 :(得分:0)

在运行时添加具有不明确名称的属性(在使用类别扩展类时会发生这种情况),对于使用哪种方法实现,行为未定义。
这只是一个命名冲突,可以通过为类别方法/属性添加前缀来避免。 Apple的"Programming With Objective-C"指南的“避免类别方法名称冲突”部分中有一些关于前缀的详细信息。

当您构建一个简单的测试项目时,您可能会观察到,运行时随机使用这两个实现中的一个。 (在测试时,请避免使用name属性的常量字符串,因为它们不会暴露行为)

通过使用类扩展而不是命名类别,编译器将生成“非法重新声明属性”错误。