【发布时间】:2010-11-25 16:55:32
【问题描述】:
101 题
假设我正在制作汽车数据库 每个汽车对象定义为:
#import <UIKit/UIKit.h>
@interface Car:NSObject{
NSString *name;
}
@property(nonatomic, retain) NSString *name;
为什么是@property(nonatomic, retain) NSString *name; 而不是@property(nonatomic, assign) NSString *name;?
我知道assign 不会像retain 那样增加引用计数器。但是为什么要使用retain,因为name 是todo 对象的成员,它的范围是它自己。
其他外部函数也不会修改它。
【问题讨论】:
-
但是为什么呢?请添加原因!
-
简单:一个 NSMutableString 是一个 NSString。如果有人向您传递了一个您保留的可变字符串,那么他们可以在之后更改它。而且由于您的属性是 NSString 类型,因此您可能不会期待这种行为。总的来说,不可变类通过调用自身的 retain 来实现 -copy,所以它(通常)不会花费你任何内存,除非你真的需要那个内存。
-
@ipmcc
readonly属性(@property (nonatomic, retain/assign/copy, readonly) NSString *myString;)呢,是retain、copy还是assign那些更好? -
使用只读属性,retain/copy/assign 对外部调用者没有影响,但仍应准确反映您如何在内部处理类的基础值。如果您使用 ARC 和 @synthesize 创建 iVar,这一点很重要,因为编译器将使用您的属性声明来指示您希望 ARC 在自动处理保留/释放时如何处理该值。
-
@ipmcc:这并不完全正确。我将不得不再次验证它,但 IIRC 如果分配了只读对象属性,则 getter 只返回 iVar 的值,如果它是保留或复制,则 getter 将 iVar 的值返回为
[[... retain] autorelease],可以是如果您曾经在代码中以某种方式替换 iVar 的值,这将是一个重要的区别。
标签: ios objective-c iphone nsstring retain