我注意到Apple的一些示例包含属性上的retain
和readonly
修饰符。如果在我们使用retain
修饰符时没有生成setter,那么包含readonly
的重点是什么?
示例:AnimatedTableView示例中的@property (retain, readonly) NSString *title;
。
答案 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相匹配,因此你会得到像“只读,保留”这样的愚蠢。