我使用以下方法来公开语言数组。
@property(nonatomic,readonly)NSArray *languages;
在 ARC 之前分配语言是这样的:
languages=[[NSArray arrayWithObjects:
[[Language alloc]initWithCode:@"es"],
[[Language alloc]initWithCode:@"en"],
nil] retain];
因此,我既能够保留对象,又可以将其标记为对外部只读。
有了 ARC,因为我无法手动输入"保留"。如何在不覆盖二传手和吸盘手的情况下做到这一点?有没有办法将 ARC 的属性标记为只读(到外部(和保留(到内部(?
retain
* 和 readonly
真的没有关系。 readonly
表示该属性只有一个 getter,没有 setter。 retain
表示类维护对属性引用的对象的保留(强(引用,而在 ARC 下,假设该属性由基础合成实例变量支持,则意味着实例变量是__strong
变量。
如果需要对外部世界只读但可以在类内部读取和写入的属性,则可以在实现 (.m( 文件的类扩展中将该属性重新声明为 readwrite
。在标题中:
@property (nonatomic, strong, readonly) NSArray *languages;
然后,在 .m 的顶部:
@interface YourClass ()
@property (nonatomic, strong, readwrite) NSArray *languages;
@end
在类的实现中,您现在可以使用 self.languages = ...;
、(或初始值设定项中的 _languages = ...;
(来设置 languages 属性。这在 ARC 与非 ARC 下实际上没有什么不同......
*在 ARC 下,更习惯使用 strong
而不是 retain
,但编译器以相同的方式对待它们。