0

重複の可能性:
self.ivarとivarの違いは?

次のクラスがあるとしましょう

@interface
@property ( nonatomic, retain ) MyObject* property;
@end

@implementation
@synthesize property = _property;

-(id) init{
   if ((self = [super init])) {
        _property = [MyObject new];
        self.property = [MyObject new];
        NSLog(@"%@", _property.description);
        NSLog(@"%@", self.property.description);
    }
    return self;
}
@end

正しい方法は何ですか?アクセサー(合成:self.property)を使用するか、ivarを直接使用しますか?他のファイルでアクセサーを使おうとすると、アクセサーを使用するとエラーが発生することがあると感じただけです。

4

1 に答える 1

5

どちらでも構いません。インスタンス変数に直接アクセスしself.propertyながら、getterメソッドまたはsetterメソッド(合成または定義済み)を呼び出します。_property

メソッドを呼び出すためself.property、副作用が発生する可能性があります。例えば:

- (Property *)property {
    if (_property == nil) {
        _property = [[Property alloc] init];
    }
    return _property;
}

を呼び出すself.propertyと、新しいプロパティが作成され、_propertyその値を返す前に存在しない場合はに割り当てられますが、このクラスの特定のインスタンスで初めて呼び出される_property前にアクセスされた場合は、nilを指します。self.property

実際、@property宣言はインスタンス変数に対応している必要はありません。メソッドの実装は、-property呼び出されるたびに新しいプロパティを作成して返すことができます。

于 2012-10-09T01:57:52.773 に答える