ARC中strong、weak、unsafe_unretained的区别

第一、strong关键字与retain关似,用了它,引用计数自动+1

如果person定义如下:

@interface Person : NSObject
@property(nonatomic,strong)Book *book1;
@end
(void)viewDidLoad {
    [super viewDidLoad];
    @autoreleasepool {
        p1=[[Person alloc] init];
        Book *book=[[Book alloc] init];
        p1.book1=book;
        NSLog(@"%@",p1.book1);
        book=nil;
    }
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%@",p1.book1);
}

输出结果:

2014-10-14 17:12:36.242 testDDD[9962:129809] <Book: 0x7f97b8e14210>
2014-10-14 17:12:36.243 testDDD[9962:129809] <Book: 0x7f97b8e14210>
即使在autorealease中执行了release,但因为retaincount加1,所以book所指的内存并没有被释放

第二、weak

声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针

如果person定义如下:

@interface Person : NSObject
@property(nonatomic,weak)Book *book1;
@end

(void)viewDidLoad {
    [super viewDidLoad];
    @autoreleasepool {
        p1=[[Person alloc] init];
        Book *book=[[Book alloc] init];
        p1.book1=book;
        NSLog(@"%@",p1.book1);
        book=nil;
    }
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%@",p1.book1);
}

输出结果:

2014-10-14 17:21:01.574 testDDD[10081:133743] <Book: 0x7fd0e8e5dc70>
2014-10-14 17:21:01.574 testDDD[10081:133743] (null)
第三、 unretained且unsafe,由于是unretained所以与weak有点类似,但是它是unsafe的.
@interface Person : NSObject
@property(nonatomic,unsafe_unretained)Book *book1;
@end
(void)viewDidLoad {
    [super viewDidLoad];
    @autoreleasepool {
        p1=[[Person alloc] init];
        Book *book=[[Book alloc] init];
        p1.book1=book;
        NSLog(@"%@",p1.book1);
        book=nil;
    }
}
-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    NSLog(@"%@",p1.book1);
}
结果为:
 
    crash
结果分析:p1执行内存被释放
unsafe_unretained声明的指针,由于book=nil已将内存释放掉了,但是string2并不知道已被释放了,所以是野指针。然后访问野指针的内存就造成crash.  所以尽量少用unsafe_unretained关键字


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值