2014-01-20 41 views
0

我有一個類,BPGameEngine,只有一個屬性,currCharacter。過去,我一直在BPGameEngine內直接分配給伊娃(如_currCharacter = someCharacter;)。在子類中,我發現自己需要寫此屬性,因此它重新聲明在一個匿名類,像這樣爲什麼分配給這個伊娃不起作用?

@interface BPGameKitMPGameEngine() 

    @property (readwrite, assign) BPCharacterInstance* currCharacter; 

@end 

然後,編譯器出現錯誤(其中,奇怪的是,我無法重現了,過兩天後來),這暗示需要一個@synthesize語句,所以我在子類(BPGameKitMPEngine)中添加了@synthesize currCharacter = _currCharacter;

我做了不是在超類中添加了一個類似的匿名類別,因爲我只是直接使用了iVar。然後我發現_currCharacter = someCharacter;裏面的方法BPGameEngineBPGameKitMPEngine調用超級([super methodContainingAssignmentToCurCharIvar]根本沒有做什麼_currCharacter出現在調試器中,並且someCharacter不是零,但在執行該行後,_currCharacter保持爲nil。奇怪的是,在子類中添加一個類似的匿名類別解決了這個問題,就像刪除了@synthesize(不再導致Xcode抱怨編譯器錯誤)一樣。

@synthesize的不一致要求看起來像是Xcode中的一個錯誤,但其餘部分卻讓我難堪。有人可以解釋在子類中使用@synthesize的問題嗎?

+0

爲什麼你的對象屬性'assign'?你沒有使用ARC? –

+0

我確實沒有使用ARC。 –

+0

原始只讀屬性的聲明在哪裏?在超類的主界面? –

回答

0

我不知道如果我沒有理解你的問題100%,但是,請執行以下操作:

  • 創建一個名爲PrivateBPGameKitMPGameEngine一類新的擴展文件。
  • 將該文件(#import "BPGameKitMPGameEngine_Private.h")導入BPGameKitMPGameEngine.mBPGameKitMPEngine.m
  • BPGameKitMPGameEngine刪除現有的類擴展代碼。

現在檢查它是否按預期工作。

2

一個支持一個屬性的自動合成實例變量對它創建的類是私有的。因此,你不能(直接)擴展一個只讀屬性來讀寫一個子類 - 不能訪問原始實例變量。

你應該得到各種錯誤,比如指出你不能從你的超類訪問私有實例變量,如果你這樣做。這聽起來像你可能已經設法創建了兩個屬性,每個屬性都有自己的支持變量,因此對其中一個的更改不是對另一個的更改 - 但是在這種情況下,我如何管理它,我不知道。

當然,你可以繞過私人的訪問......下面應該工作:

@interface BPGameKitMPGameEngine() 

    - (void) setCurrCharacter:(int)value; 

@end 

和:

- (void) setCurrCharacter:(BPCharacterInstance *)value 
{ 
    [self setValue:value forKey:@"_currCharacter"]; 
} 

HTH

+1

謝謝。這個問題的核心,除了我對另一個問題的誤解之外,那就是重新聲明最初聲明爲readwrite的超類中的變量!=在子類中重新聲明爲readwrite(謝謝你清除它),似乎是Xcode不會除非所有的實現和接口都在同一個文件中,否則實際上並沒有提到在超類中使用ivar的警告,這讓我相信@synthesize並沒有成爲另一個ivar。 –