2012-05-16 60 views
2

我在應用程序中使用QHTTPOperation.{h/m}發現here一切工作正常,但我得到了8個警告如下:修復警告:不能配對合成的setter /吸氣與用戶定義的setter /吸氣

可寫原子屬性「acceptableStatusCodes 「不能以用戶定義的設置器/吸氣劑配對 合成設定器/吸氣

可寫原子屬性‘acceptableContentTypes’不能與用戶定義的設置器配對 合成設定器/吸氣/吸氣

可寫原子屬性「authenticationDelegate」不能配對 合成的setter /吸氣與用戶定義的setter /吸氣

...

我問,因爲我已經在上面的項目發現,鏈接沒有警告有關QHTTPOperation.{h/m}.

任何想法?

感謝

回答

8

申報財產nonatomic

因爲編譯器不驗證用戶定義的訪問器的實現是原子的還是非原子的,它假定它是而不是原子。考慮到實際實現使用對象級自旋鎖(在某些情況下),這是一個非常安全的假設,支持實現的數據是從我們這裏抽象出來的。我們可以通過完成聯繫的唯一方法是使用編譯器使用的(專用)運行時函數,然後編譯器必須在此方案中驗證調用和參數是否正確。因此,用戶定義的訪問器不保證滿足標準的objc運行時原子合約。

+0

我很想知道爲什麼這解決了兩個get/set的問題。 –

+0

@LouFranco因爲如果我刪除'@synthesize'我會得到另一個'@property'需要'@synthesize'的警告,所以如果我刪除所有的自我。 acceptableStatusCodes將是錯誤 –

+1

@LouFranco解釋添加 – justin

1

這些屬性中刪除@synthesize。他們提供了get/set。

編輯:爲了清晰。在.H,他們宣稱acceptableStatusCodes與

NSIndexSet *  _acceptableStatusCodes; 

@property (copy, readwrite) NSIndexSet *   acceptableStatusCodes; 

然後,在.M,他們有

@synthesize acceptableStatusCodes = _acceptableStatusCodes; 

- (NSIndexSet *)acceptableStatusCodes 
{ 
    return [[self->_acceptableStatusCodes retain] autorelease]; 
} 

- (void)setAcceptableStatusCodes:(NSIndexSet *)newValue 
{ 
    if (self.state != kQRunLoopOperationStateInited) { 
     assert(NO); 
    } else { 
     if (newValue != self->_acceptableStatusCodes) { 
      [self willChangeValueForKey:@"acceptableStatusCodes"]; 
      [self->_acceptableStatusCodes autorelease]; 
      self->_acceptableStatusCodes = [newValue copy]; 
      [self didChangeValueForKey:@"acceptableStatusCodes"]; 
     } 
    } 
} 

這兩個塊(綜合和消息實現離子)都定義相同的信息,所以它們有衝突。設置的消息在開始時執行了額外的檢查,即自動生成的合成不會執行(對kQRunLoopOperationStateInited的檢查),所以我將刪除合成,無論如何這都將被忽略。

設置的消息被正確地實現複製語義與

self->_acceptableStatusCodes = [newValue copy]; 

而且它釋放舊值。它也做keyValue更改通知。我不知道他們爲什麼留在綜合中 - 看起來他們可能以後想要進行狀態檢查,並忘記刪除自動生成的get/set。

+0

這可能是致命的,如果屬性被定義爲其他屬性,如保留... – jimpic

+0

如果你看看代碼,他們聲明它的副本,他們提供的setter正確地複製副本。 –