ios之ARC

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/

http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html#//apple_ref/doc/uid/TP40011226

最直接的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

等....


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值