我有一个对象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吗?人怎么能知道他的代表是dealloc?
答案 0 :(得分:1)
您分配您的代理人而不是保留。 由于您释放了委托,因此它不再在您的人物对象中有效,因为它没有被它保留。
将您的委托属性更改为:
@property (retain) id<PersonDelegate> delegate
;
并且不要忘记在释放你的人物对象时释放它
答案 1 :(得分:1)
您的委托属性未设置为保留,因此只要您[theDelegate release];
通常,委托 设置为分配以避免循环引用。但在这种情况下,委托本身通常已经保留了对其委派的对象的引用。
即
Person *newPerson = [[Person alloc] init];
[self.people addObject:newPerson];
newPerson.delegate = self;
[newPerson release];
因此self.people
保留所有已创建的persons
,而persons
所有self
都指向{{1}}作为其代理人
答案 2 :(得分:1)
假设你真的想要assign
......:)
您可以将newPerson
保存为属性,并在释放委托对象之前将其委托设置为nil。
你可以让一个Person对象听取委托将要离开的通知,并让它自己设置为nil。