24

我注意到 Apple 的一些示例在属性上同时包含 aretain和修饰符。如果在我们使用修饰符时没有生成 setter,那么readonly包含的意义何在?retainreadonly

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

4

2 回答 2

36

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

富.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

最终结果是一个公共只读的属性,同时在实现中是读写的,并且编译器会自动合成 setter 和 getter。

如果类扩展中没有(readwrite,retain)覆盖(类似于),则可能会生成警告statement without an effect- 但它会更令人困惑而不是有益。在组合中还有大量不同的边缘情况同样值得警告,但并不真正表明存在实际问题。为了简单起见,决定在很大程度上接受各种模式而不会抱怨(因为它们不是正确性问题)。

于 2010-02-23T22:20:29.917 回答
17

您可以在类扩展中包含第二个私有读写声明。所有引用的内存管理方案都需要与 IIRC 匹配,所以你会变得像“只读,保留”这样的愚蠢。

于 2009-12-19T17:10:21.053 回答