财产没有保留与例子

时间:2011-07-18 10:27:09

标签: objective-c properties retain

如果我们使用没有“保留”的属性,它会改变什么?我有这个例子:

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate;  
- (id)initWithCoordinate:(CLLocationCoordinate2D) coordinate;
<。>中的

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{  
    coordinate = coord;  
    return self;  
}
“保留”通常用于制定者,不是吗?所以在这里,我们在initWith中使用setter,但是我们不使用“retain”......任何想法?

由于

3 个答案:

答案 0 :(得分:3)

CLLocationCoordinate2D不是Objective C对象,因此尝试向其发送retainrelease没有意义。

 @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。