如果我们使用没有“保留”的属性,它会改变什么?我有这个例子:
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
- (id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
<。>中的:
-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{
coordinate = coord;
return self;
}
“保留”通常用于制定者,不是吗?所以在这里,我们在initWith中使用setter,但是我们不使用“retain”......任何想法?
由于
答案 0 :(得分:3)
CLLocationCoordinate2D不是Objective C对象,因此尝试向其发送retain
和release
没有意义。
@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;
这声明了一个assign read only属性,这是对具有普通C类型的属性唯一正确的做法。另外,你说它是nonatomic
,这意味着没有代码来同步属性。由于该属性是一个由两个64位值组成的结构,这可能意味着如果在某个其他线程正在更改它的同时读取该属性,则可以返回不一致的结果。
“保留”通常用于制定者,不是吗?所以在这里,我们在initWith ... 中使用setter
不,你实际上并没有。这条线
coordinate = coord;
实际上直接分配实例变量。但是,在这种情况下,这就是您想要的。如果属性不是读/写且是Objective-C对象类型,它仍将直接分配实例变量。在这种情况下,您需要以下之一。
[self setCoordinate: coord];
或
self.coordinate = coord;
或
coordinate = [coord retain]; // in init only
顺便说一下,你的init
是错误的。它应该遵循以下模式:
-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{
self = [super init]; // assuming init is the designated initialiser of the super class
if (self != nil)
{
coordinate = coord;
}
return self;
}
答案 1 :(得分:2)
在您的特定情况下,readonly
表示您的类分配对象,然后通过不允许从外部更改此属性的属性来访问它。
通常,在分配对象时,该对象仍将由类保留,并在执行dealloc时释放。
在您的情况下,在分配给ivar时会复制CLLocationCoordinate2D
类型的对象:
coordinate = coord;
因为它不是指针对象,而是由2个双精度构成的简单结构:
typedef double CLLocationDegrees;
typedef struct {
CLLocationDegrees latitude;
CLLocationDegrees longitude;
} CLLocationCoordinate2D;
因此,这就是您在代码中看不到任何保留的原因。如果不是CLLocationCoordinate2D
对象,那么在执行对ivar的分配时,您可能需要保留NSString
。 (我说“可能”因为它取决于所分配对象的所有权)。
答案 2 :(得分:1)
retain
属性用于需要(惊讶)保留的对象。也就是说:你的对象需要分配给属性的对象留在周围,它可能不会被释放。
在您的情况下,它不会将任何内容更改为结构,而不是对象。
但您在引用的代码中使用的是readonly
,这意味着没有setter,只有getter。