xcode4.2 ARC错误处理

介绍了Xcode 4.2中引入的ARC(自动引用计数)特性,探讨了ARC如何简化内存管理,并提供了ARC与手动内存管理代码共存的方法。通过示例代码演示了strong和weak属性关键字的使用。

'xcode4.2 ARC' Tag

  • xcode4.2 ARC错误处理

    十一月 13, 2011

    伴随这iOS5的发布,xcode中加入了一个振奋人心的新特性:ARC(Automatic Reference Counting,俗称自动引用计数)。 图片来源:http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html 开启了这个特性之后,我们就不用在管理内存了。llvm3.0在编译期会自动把retain神马的加上。这就省去了很多麻烦事儿,可以把更加多的精力放在功能的实现上。 如何开启arc: 在创建项目的时候开启arc: 在创建完后开启arc: 在target的bulid setting中找到objective-C Automatic Reference Counting,选择YES: 如何让没有使用ARC的代码和使用了ARC的代码共存? 目前很多开源的框架,和我们之前写的代码中,都是手动管理内存的。代码中有很多retain,release,autorelease等和内存管理相关的代码。如果开启了arc特性后,xcode在没有就会报错。一个办法是手动把这部分的代码去掉,同时还要加各种__unsafe_retained之类的标记。这将是一个繁重的体力活。 其实我们llvm3.0中支持手动管理内存的代码和使用arc技术的代码共存的。 首先,需要开启arc特性。 然后我们可以告诉编译器那些代码没有使用arc。 具体操作如下,在target的bulid phases中展开compile source s中为不需要arc的代码加上-fno-objc-arc的参数。 上图就是我在一个arc的工程中加入了ASIHttpRequest。 如果想Three20这样添加框架的方式,可以不用设置这个参数,因为是用proj之间的依赖。





    试了下xcode的arc

    1人收藏此文章, 我要收藏发表于3个月前 , 已有 370次阅读 共 0个评论
    由strong和weak牵引而出,是相当新的东西,这是一种在编译时为程序添加retain等操作代码的方法,从而使得开发者不用关注内存的释放问题,让开发者有种像JAVA开发者的快乐感。

    比如你在一个方法里面有这样的代码(没有arc):

    1 Person *person = [[Person alloc] init:@"kut"];
    2 [person show];
    3 [person release];

    而在使用arc时,你也就不需要向person发送release消息了。如下

    1 Person *person = [[Person alloc] init:@"kut"];
    2 [person show];

    xcode为自动为你添加release代码,当然,这是在编译时做的事情。

    而定义属性时,会用到两个关键字:strong, weak,强引用和弱引用。其实就是拥有者和引用者的区别,比如说,你拥有一个对象,那么你就负责该对象的释放,你就是拥有者。而你只是引用一个对象,对象的清理和你没有关系,那么你就是引用者。按照这样的逻辑,当拥有者释放一个对象时,其它引用者原引用这个对象的实例变量就会变成nil。

    比如:在Person类中有一个属性name,Person拥有这个name:

    1 @property (strong) NSString *name;

    而在Team类中,他只是引用这个Person的name:

    1 @property (weak) NSString *managerName;

    那么当person.name = nil;时,而team.name也会自动变为nil。

     

    当我写到这儿的时候,我发现了一个问题,其实真实并不是这样运作的,-_-,让我再实验一下先。

    01 @interface Person : NSObject
    02     @property (strong) NSString *name;
    03 @end
    04  
    05 @interface Team : NSObject
    06     @property (strong) Person *manager;
    07      
    08     - (id)init;
    09 @end
    10  
    11 @implementation Team
    12  
    13 @synthesize manager;
    14  
    15 - (id)init
    16 {
    17     if (self = [super init]) {
    18         Person *person = [[Person alloc] init];
    19         person.name = @"kut";
    20         self.manager = person;
    21     }
    22      
    23     return self;
    24 }
    25  
    26 @end
    27  
    28 @interface Group : NSObject
    29     @property (weak) Person *leader;
    30 @end
    31  
    32 int main(int argc, char *argv[])
    33 {
    34     @autoreleasepool {
    35         Team *team = [[Team alloc] init];
    36         // code 1
    37         NSLog(@"team manager: %@", team.manager.name);
    38          
    39         Group *group = [[Group alloc] init];
    40         group.leader = team.manager;
    41         // code 2
    42         NSLog(@"group leader: %@", group.leader.name);
    43          
    44         team.manager = nil;
    45         NSLog(@"team manager: %@", team.manager.name);
    46         NSLog(@"group leader: %@", group.leader.name);
    47     }
    48 }

    像上面的代码,运行结果会大出你意料,最后一条NSLog输出group leader: kut,而不是group leader: (null)。

    但是如果把//code 2下的NSLog语句去掉,则最后一条NSLog输出则按上面的诠述一样运行,输出的是group leader: (null)。

    这里增加了arc的不确定性,如果weak引用的对象在此次使用之前被使用过一次,那么它一直存在,直到autoreleasepool释放它,否则就是nil,这样就麻烦了,如果代码层次很多,那么就不能保证能确定之前如果被使用过,这样代码运行的结果的不确定性就让人很头疼了。

    建议不要用arc,就上面这一点就足以让我放弃使用它了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值