0

インスタンス変数MyObject*テストがあるとしましょう。

@property(nonatomic, retain) MyObject* test;

.m

@synthesize test;

私はそれを初期化するかもしれませんし、必要に応じて今かもしれません。必要がなければ、初期化に無駄はありません。

問題はdeallocにありますが、次のチェックとリリースを行っても安全ですか?

-(void) dealloc
{
  if ( test != nil )
  {
   [test release];
  }
{

ありがとう!

4

4 に答える 4

2

はい、安全です。ただし、releasenilに送信しても問題はないので、確認する必要はありません。

于 2011-09-30T10:42:13.870 に答える
0

安全ですが、標準的な方法ではありません。メッセージをnil参照に安全に送信できます。これは、慣用的なObjective-Cの記述方法の大きな部分です。ivarをリリースするだけです。

- (void)dealloc
{
    [test release];
    // ...
于 2011-09-30T11:03:43.797 に答える
0

あなたはそれをする必要はありません。自動解放されたオブジェクトをivarに割り当てると、これを簡単に行うことができます

self.test = nil;

編集:

Dealloc関数[super dealloc]の最後に呼び出すことを忘れないでください

于 2011-09-30T10:42:10.767 に答える
0

それは完全に問題ありません。のテストを単純に省略することも、より慣用的ですnil

舞台裏では、コンパイラー(通常*)は、そのバリアントへの呼び出しobjc_msgSendまたはそのバリアントの1つを生成します。objc_msgSend(およびバリアント)の実装により、メッセージを送信するオブジェクトをnil、明確に定義され、メッセージに対するプログラマーのエラーとは見なされないという意味で使用できるようになりますnilobjc_msgSend+バリアントの戻り値はゼロになります。

例:

NSString * string = nil;
NSString * copy = [string copy]; << copy will be 0/nil
NSUInteger length = [copy length]; << length will be 0

これは、c ++オブジェクトを返す場合は、nilをテストする必要があることを意味します。レシーバーがnilの場合、コンストラクターは呼び出されません。

*通常、コンパイラがメッセージングやその他の一般的なルーチンを実行するために呼び出すc関数がいくつかあるという意味で。

于 2011-09-30T11:24:24.077 に答える