如果在类扩展中重新定义属性,它的内存管理是否会发生变化?

5
如果我有这样的一个属性:
//test.h

@interface test
@property (nonatomic, readonly, weak) NSObject x;
@end

在实现文件中重新定义为可读/可写:

// test.m
@interface test ()
@property (nonatomic, readwrite) NSObject x;
@end

我在.h文件中使用了weak关键字,但是在扩展中没有提到,这个属性会保留“weak”限定符吗?还是会更改为“strong”?

当重新定义属性时,关键字strong/assign/weak会被覆盖吗?


作为一种常见的做法,我总是在类扩展中指定属性的 strong/weak/assign 属性。在只读的公共声明中不需要这样做。 - rmaddy
@rmaddy - 在.h中仅声明readonly,在.m的类扩展中声明readwrite, weak会在Xcode 5.1.1下出现“主属性声明隐式强引用,而在类扩展中重新声明为弱引用”的错误。然而,在扩展中包含strongassign不会引起编译器的注意。后来的编译器是否改变了这一点? - CRD
@CRD 嗯,我想我还没有使用weak属性来完成那个。好的,知道了。 - rmaddy
1个回答

5
使用Xcode 5.1.1进行简单测试显示,weak属性被保留。对于assignstrong属性也是如此 - 可以在.h中指定它们,并在.m中省略它们,如果您在.m中包含它们,则两者必须匹配。话虽如此,我不知道这是否有文档记录。但是Objective-C的语义也没有在任何地方正式定义。因此请自行承担风险。建议:只需重复它即可。

你如何检查属性是否设置?我正在尝试找到一种检查这些内容的方法。谢谢! - Wingzero
在编译时只需读取 .h 文件;对于运行时查找函数 property_getAttributes,请参阅文档。 - CRD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接