如何使用ARC在iOS中将对象标记为Retain和Readonly?

时间:2013-10-08 15:43:39

标签: 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];

所以,我既能保留这个物体,又能将它标记为外部的读物。

使用ARC, 因为我无法手动输入“保留”。如何在不超越setter和getter的情况下做到这一点?有没有办法标记一个属性readonly(to outside)和retain(to inside)for ARC?

1 个答案:

答案 0 :(得分:3)

retain *和readonly实际上彼此无关。 readonly表示该属性只有一个getter,而不是一个setter。 retain表示该类维护对该属性引用的对象的保留(强)引用,并且在ARC下,假设该属性由基础合成实例变量支持,则表示该实例变量为{{ 1}}变量。

如果您想要一个对外界只读的属性,但可以在类中读取和写入,则可以在实现(.m)的类扩展中将该属性重新声明为__strong文件。在标题中:

readwrite

然后,在.m的顶部:

@property (nonatomic, strong, readonly) NSArray *languages;

在类的实现中,您现在可以使用@interface YourClass () @property (nonatomic, strong, readwrite) NSArray *languages; @end ,(或初始化程序中的self.languages = ...;)来设置languages属性。在ARC与非ARC之间,这实际上并没有什么不同......

*在ARC下,使用_languages = ...;代替strong更为习惯,但编译器会以同样的方式对待它们。