关注下指针互指的情况
C
@property(nonatomic,assign)id p;
void dealloc
{
[p release];
...
}
----
A
C * c;
void dealloc
{
[c release];
…
}
--
C 的dealloc 方法中不应该写[p release];
写了后,调用A的dealloc,执行到[c release]又会调用C的dealloc
又调用A的dealloc。。。
这样会出现循环调用,直到stack空间不足,程序崩溃
在dealloc中测试发现 [p retainCount] [c retainCount] 的值都是1
(gdb) po [m_delegate retainCount]
0x1 does not appear to point to a valid object.
(gdb) po [self retainCount]
0x1 does not appear to point to a valid object.

从这里可以看出,对于互指的指针(代理),需要注意其使用
同时,可以看出 self.p = nil; 这种写法的好处,这样写不仅符合美学上对称(使用release的话,并没有与之对应的alloc),
而且不用关注变量的属性(retain还是assign),
写成 self.p = nil;是没有问题的,如果是assign, 就不会去调用release