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
对象的成员,它的范围是它自己。
其他外部函数也不会修改它。
最佳答案
Objective-C 中没有“对象的范围”这样的东西。范围规则与对象的生命周期无关——保留计数就是一切。
您通常需要声明对实例变量的所有权。见 the Objective-C memory management rules .使用 retain
属性,您的属性 setter 声明新值的所有权并放弃旧值的所有权。使用 assign
属性,周围的代码必须这样做,这在职责和关注点分离方面同样困惑。您使用 assign
属性的原因是您无法保留该值(例如 BOOL 或 NSRect 等非对象类型),或者保留它会导致不必要的副作用。
顺便说一下,对于 NSString,正确的属性类型通常是 copy
。这样,如果有人传入 NSMutableString(这是有效的——它 是一种 NSString),它就不会从你下面改变。
关于ios - Objective-C 101(保留与分配)NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380338/