2012-08-27 30 views
0

我指的是從一個子類的getter和setter時遇到性能問題屬性:的iOS:使用超類的getter和setter不是在Xcode工作了4.4

在基礎類中,我有一個屬性所謂listItems中使用了定製的setter:

@interface BaseList{ 
    NSArray *_listItems; 
} 
@property (nonatomic, retain) NSArray *listItems; 
@end 

@implementation BaseList 
@synthesize listItems = _listItems; 

-(void)setListItems:(NSArray *)listItems 
{ 
    [_listItems release]; 
    _listItems = [listItems retain]; 
    //... some logic 
} 
@end 

子類有與listItems中,如更具體的名稱的屬性地址:

@interface AddressList 
@property (nonatomic, retain, getter = listItems, setter = setListItems:) NSArray *addresses; 
@end 

的地址屬性沒有在AddressList中的implmentation合成的,因爲它應該使用超類的listItems屬性的getter和setter。但是,設置後:

self.addresses = [NSArray array]; 

該屬性仍然爲零。有趣的是,我相信這與Xcode的早期版本很好。我目前正在使用Xcode 4.4(4.4.1),我不確定我是否只是做錯了,或者如果在這種情況下某些屬性相關的東西發生了變化。如果有人能告訴我如何正確地做到這一點,我將非常感激。

+1

我猜你的第二個屬性中缺少的開放括號只是一個複製和粘貼錯誤,而不是真的在你的代碼中缺少? – DrummerB

+0

複製粘貼錯誤! ;) 非常感謝你!更正! – Mobiletainment

回答

3

Apple改變了訪問器在Xcode 4.4中被合成的方式。您不需要再聲明一個ivar,而且您不必綜合訪問器。你仍然可以可以當然聲明你自己的ivars和合成器,但由於你沒有,編譯器爲你做。

您可以使用@dynamic來取消。

有一個警告,您可以在生成設置中打開,名爲隱式合成屬性。將其打開以臨時獲取有關爲您合成的所有訪問器的警告。

在Xcode 4.4開始,蘋果LLVM編譯器將隱 合成未明確使用 @synthesize合成屬性。此警告警告關於這種隱式行爲,即使 雖然該屬性仍然合成。這實質上是一個向後兼容警告,或者對於那些希望繼續到 明確使用@synthesize的人。

0

好的,這很有趣。

首先,從您的BaseList聲明中移除ivar _listItems。 合成爲您創建伊娃,可能會導致重複的名稱錯誤。

我看到你決定重寫合成的setter ...技術上至少。嘗試將方法名稱更改爲setlistItems(小L)。這樣,無論何時調用self.listItems = x,它都會調用您的自定義設置器。

嘗試添加合成。否則,該變量可能根本不存在。至少在我看來。對不起,如果這沒有什麼幫助。

+2

'setListItems'是正確的大寫字母。編譯器足夠聰明,可以處理標準的駱駝案例。 –

+0

@NoahWitherspoon就是這樣嗎?謝謝你指出,我不知道。 – ATaylor

2

在您的AddressList實施中,添加@dynamic addresses;。這將使它xcode不會自動爲您生成任何東西。現在Xcode生成-listItemssetListItems:方法,這些方法引用自動生成的實例變量_addresses