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

Mat*_*jca 24 memory-management objective-c declared-property

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

示例:@property (retain, readonly) NSString *title;来自AnimatedTableView示例.

bbu*_*bum 36

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

foo.h中:

@interface StuffHolder:NSObject
@property(readonly, retain) MyStuff *stuff;
@end
Run Code Online (Sandbox Code Playgroud)

Foo.m:

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

@implementation StuffHolder
@synthesize stuff;
@end
Run Code Online (Sandbox Code Playgroud)

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

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

  • 他们肯定得到支持.如果您发现一个不起作用的特定模式(应该是),请提交错误!http://bugreport.apple.com/ (2认同)

Chu*_*uck 17

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

  • 这并不完全是愚蠢的; 修饰符与@synthesize的矩阵使得getter的代码**可以改变.试图准确地说明应该添加哪些修饰符,而#warn应该充斥着细节并且最终难以理解.最好简单地使用"必须相同,除了readonly-> readwrite". (3认同)