iOS+5+ARC完全指南下载传送门
http://download.csdn.net/detail/loganv/5400019
参考
http://www.cocoachina.com/newbie/tutorial/2013/0407/5945.html
http://www.cocoachina.com/newbie/basic/2012/1016/4927.html
http://blog.csdn.net/zkdemon/article/details/7446385
http://blog.csdn.net/favormm/article/details/7023322
http://www.onevcat.com/2012/06/arc-hand-by-hand/
最直接的arc与非arc项目类的转换
直接在targets->build phases中修改compiler Flags,是否支持arc。添加:-fobjc-arc,就可以让旧项目支持arc。如果想让原来支持arc的不使用arc则添加-fno-objc-arc
或者Edit\Refactor\Convert to Objective-C ARC
想学ios的arc首先要知道ios框架的4个分层
cocoa touch
media
core services
core OS
而arc只适用于第一层也就是cocoa touch,对于其他层的类如quartz,或core foundation就需要手动释放内存
arc编程注意事项
IBOutlet,除了File's Owner连接顶层对象用strong,其他IBOutlet都用weak;
oc对象与core foundation的arc管理转换如下
__bridge_transfer,是给arc管理内存,不要手动释放;用于core foundation转为oc对象
__bridge_retained,解除arc管理内存,需要手动释放;用于oc对象转为core foundation
core foundation ----------> oc,如下(CFBridgingRelease()。函数所做事情和 __bridge_transfer 强制转换完全一样,但更加简洁和清)
- (NSString *)escape:(NSString *)text
{
return CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(
NULL,
(__bridge CFStringRef)text,
NULL,
CFSTR("!*'();:@&=+$,/?%#[]"),
CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding)));
}
oc --------> core foundation,如下(同样__bridge_retained也有一个辅助函数:CFBridgingRetain())
NSString *s1 = [[NSString alloc] initWithFormat:@"Hello, %@!", name];
CFStringRef s2 = (__bridge_retained CFStringRef)s1;
// do something with s2
// . . .
CFRelease(s2);
要将Objective-C对象和void *互相转换,你也需要使用__bridge转换,如下:
MyClass *myObject = [[MyClass alloc] init];
[UIView beginAnimations:nil context:(__bridge void *)myObject];
在animation delegate方法中,你再将对象强制转回来:
- (void)animationDidStart:(NSString *)animationID
context:(void *)context
{
MyClass *myObject = (__bridge MyClass *)context;
. . .
}
总结:
• 使用CFBridgingRelease(),从Core Foundation传递所有权给Objective-C;
• 使用CFBridgingRetain(),从Objective-C传递所有权给Core Foundation;
• 使用__brideg,表示临时使用某种类型,不改变对象的所有权。
@autorelease中只能写oc代码,core foundation需要CFAutorelease();
常用不支持arc第三方库,也可以编译成静态.a文件,添加到项目中去;
ios面试或笔试时,常常会被问delegate是应该用weak,还是strong;
最给力的回答,大多数用weak,如果是用strong,则会造成retain回还,当两个对象互相retain时,会导致两个对象都无法被释放,这也是内存泄漏的常见原因之一,而weak指针可以避免retain回还。
以上只是arc的初级应用,高级应用后续研究zhong......
比如block 与arc;
@autoreleaseepool,__autoreleasing,多线程与arc;
第三方库如cocos2d与arc
等....