1

でデリゲートをnilに設定する必要があることを読みましたdealloc。私はそれがでそれをしていることに気づきましたinit、これは大丈夫ですか、それともあなたは同じことをするべきですdeallocか?

「これは微妙なものですが、便利なものです。自分をデリゲートとして別のオブジェクトに渡す場合は、デロックする前にそのオブジェクトのデリゲートをリセットしてください。」

file.h

@interface TestService : NSObject
{
    NSObject <TestServiceDelegate> *m_delegate;
}

@property (nonatomic, assign) NSObject <TestServiceDelegate> *delegate;

file.m

 @synthesize delegate=m_delegate;

    - (id)init
    {
        if (self = [super init])
        {        
            m_delegate = nil;
        }

        return self;
    }

    - (void)dealloc

    {
         [super dealloc];
    }
4

2 に答える 2

8

どちらも必要ありません。

メソッドの場合init、インスタンス変数は で始まるnilので、関係ありません。

の場合、deallocデリゲート インスタンス変数は (ここでは推測していますが、そうでない場合はそうすべきです!) weak(ARC) またはassign(非 ARC) プロパティとして設定されているため、オブジェクトの割り当てを解除すると、何も送信されません。デリゲートに。

于 2013-02-18T17:01:27.153 に答える
5

この引用を追加しました:

「これは微妙ですが便利なものです。デリゲートとして別のオブジェクトに自分自身を渡す場合は、そのオブジェクトのデリゲートをリセットしてから、ロックを解除してください。」

これは、投稿したコードとはかなり異なるものを指しています。引用は次の例に適用されます。

Foo.m:

- (void)someFooMethod {
    _someBariVar = [[Bar alloc] init];
    _someBariVar.delegate = self;
}

- (void)dealloc { // Foo's dealloc
    _someBariVar.delegate =  nil;
    [_someBariVar release];

    [super dealloc];
}

これのポイントは、メソッドが呼び出されBarたときにオブジェクトが他の誰かによって保持されている場合に備えてです。インスタンスはなくなったが、Foo deallocそうではないので、インスタンスに有効なデリゲートがあるとまだ思わせたくありません。FooBarBar

于 2013-02-18T17:11:14.977 に答える