0

サブクラスからgetterとsetterを参照するときに、プロパティで問題が発生しました。

基本クラスには、カスタムセッターを持つlistItemsというプロパティがあります。

@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

アドレスプロパティは、スーパーのlistItemsプロパティのゲッターとセッターを使用する必要があるため、AddressListの実装では合成されません。ただし、設定後:

self.addresses = [NSArray array];

プロパティはまだnilです。面白いことに、これは以前のバージョンのXcodeでうまく機能したと思います。私は現在Xcode4.4(4.4.1)を使用していますが、それが単に間違っているのか、それともこのコンテキストでプロパティ関連のものが変更されているのかわかりません。誰かがそれを正しく行う方法を教えてくれたらとてもありがたいです。

4

3 に答える 3

3

Appleは、Xcode4.4でアクセサを合成する方法を変更しました。もうivarを宣言する必要はなく、アクセサーを合成する必要もありません。もちろん、独自のivarとシンセサイザーを宣言することもできますが、宣言しないため、コンパイラーが自動的に宣言します。

@dynamic代わりにを使用してこれを抑制することができます。

ImplicitSynthesizedPropertiesと呼ばれるビルド設定でオンにできるという警告があります。これをオンにすると、合成されたすべてのアクセサーに関する警告が一時的に表示されます。

Xcode 4.4以降、Apple LLVMコンパイラは、@synthesizeを使用して明示的に合成されていないプロパティを暗黙的に合成します。この警告は、プロパティがまだ合成されている場合でも、そのような暗黙の動作について警告します。これは本質的に後方互換性の警告であるか、または@synthesizeを明示的に使用し続けたい人のためのものです。

于 2012-08-27T17:34:54.347 に答える
2

AddressList実装では、を追加します@dynamic addresses;。これにより、xcodeが自動的に何も生成しないようになります。現在、Xcodeは、自動生成されたインスタンス変数を参照するメソッドを生成してい-listItemsます。setListItems:_addresses

于 2012-08-27T17:30:57.787 に答える
0

さて、これは面白いです。

まず、BaseListの宣言からivar_listItemsを削除します。合成により、そのivarが作成され、名前の重複エラーが発生する可能性があります。

合成されたセッターをオーバーライドすることにしたようです...少なくとも技術的には。メソッド名をsetlistItems(小さいL)に変更してみてください。そうすれば、self.listItems = xを呼び出すたびに、カスタムセッターが呼び出されます。

その合成を追加してみてください。そうしないと、変数がまったく存在しない可能性があります。少なくとも私の意見では。それが役に立たない場合は申し訳ありません。

于 2012-08-27T17:30:37.647 に答える