2

次の例は、Person クラスの dealloc メソッドを実装する方法を示しています。

@interface Person : NSObject
@property (retain) NSString *firstName;
@property (retain) NSString *lastName;
@property (assign, readonly) NSString *fullName;
@end

@implementation Person
// ...
- (void)dealloc
    [_firstName release];
    [_lastName  release];
    [super      dealloc];
}
@end

上記はAppleのドキュメントからのものです: メモリ管理の例

私の質問は、dealloc の firstName と lastName の前にアンダースコアがあるのはなぜですか?

4

3 に答える 3

2

プロパティは通常、次のように合成されます。

@synthesize firstName = _firstName, …;
于 2013-01-11T05:43:21.983 に答える
1

self.firstNameあなたが実際にゲッターを呼び出しているとき(呼び出しfirstNameと同じです。これらのゲッターメソッドとセッターメソッドは、実際には次のように、基になるインスタンス変数にアクセスします。self.firstName = @""setFirstName:

- (NSString *)firstName
{
    return _firstName;
}

_firstNameを実行すると、セッターを経由せずにインスタンス変数に直接アクセスします。init人々がインスタンス変数に直接アクセスする理由deallocは、setterメソッドまたはプロパティを監視しているオブジェクト[1]がコードを実行できるためです。initオブジェクトが(で)それ自体の初期化を完了していないか、(で)そのプロパティの一部が解放されているため、これは悪い可能性がありますdealloc

を書くときは、。ではなく@sythesize firstName = _firstName、基になるインスタンス変数に具体的に名前を付けます。このようにして、誤ってセッターメソッドとKVOを入力してバイパスすることはありません。を記述しない場合、コンパイラは自動的にインスタンス変数に名前を付けます。_firstNamefirstNamefirstName@synthesize_firstName

個人的な推奨事項-私はARCを使用して、deallocに対処する必要がないようにします。

[1] Key-Value監視は、プロパティの変更を通知するためにオブジェクトを登録できる方法です。これは、メソッドを通じて@synthesize、または正しく名前が付けられて自動的に提供されます。gettersetter

于 2013-01-11T05:53:09.040 に答える
1

アプローチ :: デフォルトでは、getter アクセサー メソッドと setter アクセサー メソッドを合成すると、プロパティと ivar が同じ名前であると見なされます。

これにより、getter/setter メソッドを使用している場合と、ivar に直接アクセスしている場合を一見すると混乱する可能性があります。

別の方法は、ivar にプロパティとは異なる名前を付けることです。一般的なアプローチは、下線を使用して ivar 名の前に付けることです。

このリンクを参照できます: http://useyourloaf.com/blog/2011/02/08/understanding-your-objective-c-self.html

于 2013-01-11T05:45:50.143 に答える