比如在A頁面設置B的delegate為A的實例,
// A.m中某處
B* b = [B alloc] init];
b.delegate = self;
[self.view addSubview:b];
[b release];
那麼
1.是A負責創建B的,A的生命周期一定比B要長(B存在,A一定也存在;A存在,B不一定存在)
也就是說 在B(實例b)存在的時候,A(的實例)一定存在, 所以沒有必要用retain將引用計數+1,assign足以
2.退一步假設存在這樣的情況:A比B先掛掉(A的實例先被release銷毀)
那麼當然希望是[a relase]後,A中的方法不再被B調用,但是使用retain時候,A還是沒有被銷毀,所以 A中的方法仍會被B調用,但是assgin就無此問題
3.本質上delegate就是一根指向先於它存在的某個類(CCClass)的指針(假設是:ccPoint),我們通過delegate這根指針去指向這個已經存在的指針(ccPoint) 那麼通過delegate即ccPoint也就可以訪問CCClass中的實例方法
4.避免retain cycle,即:有A,B兩個Object, A中有一個B的實例變量,B中又有一個A的實例變量,要release A就必須releaseA中的B,而要release B有必須release B中的A,這樣就產生了一個Retain Circle,A B都不能被dealloc.解決Retain Circle的方法就是使用弱引用(weak reference),弱引用沒有被引用的那個Object的所有權,也就不需要release它,從而解決了Retain Circle問題.為了防止Retain Circle的發生, delegate通常都是弱引用的, 因此我們一般不應該retain一個delegate。NSURLConnection是個例外。