2

私はオブジェクトを持ってPersonおり、プロトコルPersonDelegate
Personには@property (assign) id<PersonDelegate> delegate; があります。

私のコードのどこかで私はします:

Person *newPerson = [[Person alloc] init]; 
newPerson.delegate = theDelegate;  
...  
[theDelegate release]; // and dealloc

...

now Person has some new information for the delegate, so I call in Person
[self.delegate doSomething];

しかし、それから私はEXC_BAD_ACCESSを取得しています

これは、代理人がすでに取引を停止していたためですか?自分の代理人がdeallocであることをPersonはどのようにして知ることができますか?

4

3 に答える 3

1

デリゲートプロパティは保持するように設定されていないため、保持するとすぐに無効になります[theDelegate release];

通常、デリゲート循環参照を回避するために割り当てるように設定されています。ただし、その場合、委任自体は通常、委任元のオブジェクトへの参照をすでに保持しています。

すなわち。

Person *newPerson = [[Person alloc] init]; 
[self.people addObject:newPerson];
newPerson.delegate = self;
[newPerson release];

したがって、作成されたものすべてをself.people保持し、それらすべてがデリゲートとして指し示しますpersonspersonsself

于 2012-05-28T14:36:44.907 に答える
1

あなたが本当に欲しいと仮定してassign....:)

をプロパティとして保存しnewPerson、デリゲートオブジェクトが解放される前にそのデリゲートをnilに設定できます。Personオブジェクトに、デリゲートがなくなるという通知をリッスンさせ、それ自体をnilに設定させることができます。

于 2012-05-28T14:37:08.680 に答える
1

デリゲートを保持するのではなく、割り当てることになります。デリゲートを解放すると、デリゲートによって保持されなかったため、personオブジェクトでは無効になります。

デリゲートプロパティを次のように変更します。

@property (retain) id<PersonDelegate> delegate;

人物オブジェクトのロックを解除するときにリリースすることを忘れないでください

于 2012-05-28T14:36:17.807 に答える