2011年11月5日 星期六

Automatic Reference Counting (ARC) 1

XCode 4.2 新的支援 - ARC

因為朋友在問,就去看了一下,實際上我還沒有使用它來做專案過

CFURLRef baseURL = (__bridge CFURLRef)[[NSURL alloc] initFileURLWithPath:sndpath];
AudioServicesCreateSystemSoundID (baseURL, &beep1);

這個是會當掉的,正確的方式是

CFURLRef baseURL = (__bridge_retained CFURLRef)[[NSURL alloc] initFileURLWithPath:sndpath];
AudioServicesCreateSystemSoundID (baseURL, &beep1);

如果之前很習慣 alloc、release、autorelese 的話,要習慣 ARC 也不是一件難事
只要思考物件的生命週期就好了

像是上面的例子,_bridge 所給予的是弱連結,此連結不會影響該物件的生命週期。在 alloc 出來後,ARC 判斷沒有其他變數影響該物件後馬上就 release 掉了,因此 baseURL 仍是 null,所以就當掉啦,而 _strong 會保持該物件指定給 baseURL 後,在 baseURL 存在期間不會消失,所以第二個就通過了。

像寫法也是可以的
NSURL *url = [[NSURL alloc] initFileURLWithPath:sndpath];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)url, &beep1);

ARC 是判斷該物件的生存週期,然後在 Source 裡加入 release 的動作,來減少程式設計師的負擔
實際上的運用原理跟以前的 relase 一樣,只是變的簡單思考,也少寫了很多 Code。

沒有留言:

張貼留言