ios - 如何使用 ARC 在 iOS 中将对象标记为保留和只读?

标签 ios objective-c automatic-ref-counting retain

我使用以下内容来公开语言数组。

@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/

相关文章:

objective-c - ARC 中的 "Fire and forget"类

ios - 相同顺序索引 Swift 1.2 中的字典值和键

ios - 如何在每个需要登录的 View Controller 上检查用户身份验证?

objective-c - 设置自定义 tableviewCell 的背景

ios - 在 IOS 中单击按钮上的日期选择器

objective-c - AVAudioPlayer 立即停止播放 ARC

iphone - 发布新版本时更改已发布应用程序的包 ID

ios - iPhone - 如何将 .caf 音频文件转换为 .aac?

iphone - 如何关闭 UIPopoverController?

ios - 启用 ARC 时 NSXMLParser 抛出 EXC_BAD_ACCESS