如何使用 ARC 在 iOS 中将对象标记为“保留”和“只读”



我使用以下方法来公开语言数组。

@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 ,但编译器以相同的方式对待它们。

最新更新