ivarsを宣言せずにスーパークラスに@property
を宣言しただけでサブクラス化し、サブクラスでスーパークラスivar(_propertyName
)を使用してgetterを実装しようとすると、xcodeはUse of undeclared identifier '_propertyName'
というエラーを呼び出します。スーパークラスでivarsを宣言するか、サブクラスで@synthesizeを宣言しますか?
ベストプラクティスに準拠したソリューションは何ですか?
万一Iサブクラスの@implementation
または
@synthesize propertyName = _propertyName
@interface SuperClass : AnotherClass
{
Type *_propertyName;
}
@property Type *propertyName;
@end
編集:私はによる自動プロパティのアクセサメソッドの「合成」と 『アンダーバーアイバーズ』の作成を理解して
コンパイラ。
イバールはSuperClass
の実装からアクセスできません。@synthesize
またはインターフェイスまたは実装セクションにivarsが宣言されていません。私の例
さらに明確化: 免責事項:アルフィーハンセン
@interface SuperViewController : UIViewController
@property (nonatomic, strong) UITableView * tableView; // ivar _tableView is automatically @synthesized
@end
#import "SuperViewController.h"
@interface SubViewController : SuperViewController
// Empty
@end
@implementation SubViewController
- (void)viewDidLoad
{
NSLog(@"tableView: %@", self.tableView); // this is perfectly OK
}
// ************* This causes problem **************
- (UITableView *) tableView {
if (!_tableView) { // Xcode error: Use of undeclared identifier '_propertyName'
_tableView = [[SubclassOfUITableView alloc] init];
}
return _tableView;
}
// ************************************************
@end
これは奇妙です。Objective Cのivarsはデフォルトで保護されているため、サブクラスは自分のものと同じようにアクセスできなければなりません。どのように '_propertyName'にアクセスしてそのエラーを取得しますか? – dasblinkenlight
あなたのプロパティが '@property Type * _propertyName;'ならば、ivarは '__propertyName'と思うでしょう。 (2つのアンダースコア)あなたのサブクラスがivarに直接アクセスする必要があるのはなぜですか? – BergQuester
FYI、プロパティを@合成する必要はもうありません。ヘッダファイルでそれらを宣言するだけで、合成はXcode /コンパイラによって自動的に行われます。 – davidf2281