2014-07-23 25 views
1

假設在某些類接口中,我聲明一個屬性爲「copy」屬性,該屬性是另一個類的實例,其不是實現「-copyWithZone」。例如說不應該編譯器警告我該類不響應copyWithZone?

@interface Dog: NSObject 
@property (assign) int i; 
@end 

@interface Pets: NSObject 
@property (copy) Dog *myDog; 
@end 

然後地方我做

Pets *myPets = [[Pets alloc] init]; 
Dog *uglyDog = [[Dog alloc] init]; 
myPets.myDog = uglyDog; 

什麼情況是,在運行時我得到這樣一個異常「 - [狗copyWithZone:]:無法識別的選擇......」我完全已瞭解。

但不應該編譯器警告我這個嗎? (它沒有)。

+0

它會,如果你宣佈@接口狗:NSObject 。 – gnasher729

回答

0

編譯器應該能夠在合成副本訪問器的情況下解決這個問題。我會打開一個雷達,要求在那裏發出警告。

需要注意的是,警告應該只針對引用非NSCopying類的自動合成副本訪問器。如果您自己重寫訪問器,編譯器不應該發出警告。我有很多與copy屬性不符合NSCopying的類;我只是在setter中實現複製語義。這種情況下的copy是調用者的文檔,而不是編譯器的指令。

1

@property修飾符用於指定(或修改)實例變量的行爲。 Objective-C是一種動態語言,因此它可以在運行時評估大部分類型。複製修飾符不僅僅是向對象發送複製消息,並且因爲消息在運行時分派,所以在消息到達不響應其選擇器的消息對象之前,您將不會收到任何類型的錯誤。 只有當你指定你想你的類由符合NSCopying協議,你會得到從編譯器警告:

@interface MyClass : Superclass <NSCopying> 

比你不執行所需的方法。 希望它有幫助。

+0

感謝您的回覆。我假設我要求編譯器合成myDog的setter(感謝@Rob指出了這一點)。因此,編譯器(道德上)生成一個代碼,將「複製」(或「copyWithZone:」)消息發送給myDog。我認爲給出「可能不響應」警告可能是一個好主意,我只是想知道如果可能有理由_不發佈此警告,但我沒有看到它們。 – brian0

相關問題