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

这是因为委托已经解除分配了吗?Person 怎么知道他的委托是 dealloc?

4

3 回答 3

1

您正在分配您的代表而不是保留它。由于您释放了您的委托,它在您的个人对象中不再有效,因为它没有被它保留。

将您的委托属性更改为:

@property (retain) id<PersonDelegate> delegate;

当你释放你的人对象时不要忘记释放它

于 2012-05-28T14:36:17.807 回答
1

您的委托属性未设置为保留,因此一旦您这样做,它就会变坏[theDelegate release];

通常将委托设置为分配,以避免循环引用。但在这种情况下,委托本身通常已经保留了对其委托的对象的引用。

IE。

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

self.people保留所有persons已创建的内容以及persons所有内容都指向self他们的代表也是如此

于 2012-05-28T14:36:44.907 回答
1

假设你真的想要assign.... :)

您可以在newPerson释放委托对象之前将其保存为属性并将其委托设置为 nil。您可以让 Person 对象侦听代理即将离开的通知,并自行将其设置为 nil。

于 2012-05-28T14:37:08.680 回答