2011-07-18 71 views
1

如果我們使用一個財產沒有「保留」,它是什麼改變?我有這個例子:財產沒有保留與例

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 
- (id)initWithCoordinate:(CLLocationCoordinate2D) coordinate; 

在.M:

-(id)initWithCoordinate:(CLLocationCoordinate2D)coord{ 
    coordinate = coord; 
    return self; 
} 

的 「保留」 通常用於設置器,是嗎?所以在這裏,我們使用setter,在initWith ...中,但我們不使用「保留」...任何想法?

感謝

回答

3

CLLocationCoordinate2D不是Objective C對象,因此嘗試將retainrelease發送給它是沒有意義的。

@property (nonatomic, readonly) CLLocationCoordinate2D coordinate; 

這聲明瞭一個賦值只讀屬性,這是對於純C類型屬性唯一正確的操作。另外你說這是nonatomic這意味着沒有代碼來同步屬性。由於該屬性是一個由兩個64位值組成的結構,這可能意味着如果您在某個其他線程正在更改的同時讀取該屬性,則可能會返回不一致的結果。

「保留」通常用於setter,不是嗎?所以在這裏,我們使用setter,在initWith ...

不,你實際上沒有。該行

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; 
} 
+0

感謝您的傑出答案,我不確定要理解非原子事物,這意味着什麼「同步財產」?我通過文檔閱讀,但我不確定這個意思。爲了說明,非常感謝 – Paul

+0

@Paul:基本上,這意味着讀寫操作被鎖定環繞,以防止兩者在線程環境中同時發生。 – JeremyP

+0

好的,那麼這個非原子有什麼改變嗎? – Paul

2

在特定情況下,readonly意味着你的類分配對象,然後通過不允許此屬性從外部被更改的屬性可以訪問它。

一般來說,對象在分配時仍然保留,當執行dealloc時釋放。

coordinate = coord; 

,因爲它不是一個指針對象,而不是一個簡單的結構做出來的2個雙打:

typedef double CLLocationDegrees; 
typedef struct { 
    CLLocationDegrees latitude; 
    CLLocationDegrees longitude; 
} CLLocationCoordinate2D; 

在你的情況,CLLocationCoordinate2D類型的對象被分配到伊娃時複製所以,這就是你在代碼中看不到任何保留的原因。如果不是CLLocationCoordinate2D對象,那麼這是一個NSString,您在完成對伊娃的任務時可能需要保留。 (我說「可能」,因爲它全部取決於所分配對象的所有權)。

+0

塞爾吉奧感謝您的偉大的答案 – Paul

1

retain屬性用於對象需要(驚喜)保留。那就是:你的對象需要分配給屬性的對象留下來,它可能不會被釋放。

在你的情況,它不會改變任何東西作爲一個結構,而不是一個對象。

但是你在引用的代碼中使用的是readonly,這意味着沒有setter,只有一個getter。

+0

感謝DarkDust! – Paul