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。
沒有留言:
張貼留言