为什么声明的属性同时使用retain和readonly?

时间:2009-12-19 17:05:29

标签: objective-c memory-management declared-property

我注意到Apple的一些示例包含属性上的retainreadonly修饰符。如果在我们使用retain修饰符时没有生成setter,那么包含readonly的重点是什么?

示例:AnimatedTableView示例中的@property (retain, readonly) NSString *title;

2 个答案:

答案 0 :(得分:36)

或者,更具体地说,(readonly,retain)启用这样的模式:

foo.h中:

@interface StuffHolder:NSObject
@property(readonly, retain) MyStuff *stuff;
@end

Foo.m:

@interface StuffHolder()
@property(readwrite, retain) MyStuff *stuff;
@end

@implementation StuffHolder
@synthesize stuff;
@end

最终结果是在实现中进行readwrite时公开只读的属性,并且编译器会自动合成setter和getter。

在类扩展中没有(readwrite,retain)覆盖的情况下会生成警告 - 类似于statement without an effect - 但它会比有益的更令人困惑。在组合中还有一大堆不同的边缘情况,这些情况同样需要警告,但并不能真正指出实际问题。为了简单起见,我们决定基本上接受各种模式而不抱怨(因为它们不是正确性问题)。

答案 1 :(得分:17)

您可以在类扩展中包含第二个私有readwrite声明。所有参考文献的内存管理方案都需要与IIRC相匹配,因此你会得到像“只读,保留”这样的愚蠢。