我使用以下内容来公开语言数组。
@property(nonatomic,readonly)NSArray *languages;
在ARC之前分配语言是这样的:
languages=[[NSArray arrayWithObjects:
[[Language alloc]initWithCode:@"es"],
[[Language alloc]initWithCode:@"en"],
nil] retain];
因此,我既能够保留该对象,又能将其标记为对外只读。
有了弧线, 因为我不能手动输入“保留”。我怎样才能在不覆盖 setter 和 getter 的情况下做到这一点?有没有办法为 ARC 将属性标记为只读(对外部)和保留(对内部)?
最佳答案
retain
* 和 readonly
真的没有任何关系。 readonly
表示该属性只有 getter,没有 setter。 retain
意味着该类维护对属性引用的对象的保留(强)引用,并且在 ARC 下,假设属性由底层的合成实例变量支持,意味着实例变量是一个 __strong
变量。
如果您想要一个对外界只读但可以在类内部读写的属性,您可以在实现的类扩展中将该属性重新声明为readwrite
( .m) 文件。在标题中:
@property (nonatomic, strong, readonly) NSArray *languages;
然后,在 .m 的顶部:
@interface YourClass ()
@property (nonatomic, strong, readwrite) NSArray *languages;
@end
在类的实现中,您现在可以使用 self.languages = ...;
(或初始化程序中的 _languages = ...;
)来设置语言属性。这在 ARC 与非 ARC 下实际上并没有什么不同......
*在ARC下,更习惯使用strong
而不是retain
,但编译器以同样的方式对待它们。
关于ios - 如何使用 ARC 在 iOS 中将对象标记为保留和只读?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252293/