0

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

@property(nonatomic,readonly)NSArray *languages;

在 ARC 之前分配语言是这样的:

languages=[[NSArray arrayWithObjects:
               [[Language alloc]initWithCode:@"es"],
               [[Language alloc]initWithCode:@"en"],
               nil] retain];

因此,我既可以保留该对象,也可以将其标记为对外部只读。

使用 ARC,因为我无法手动输入“retain”。如何在不覆盖 setter 和 getter 的情况下做到这一点?有没有办法为 ARC 标记只读(到外部)和保留(到内部)的属性?

4

1 回答 1

3

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

于 2013-10-08T15:52:13.010 回答