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关键字

时间: 2024-08-10 06:50:45

ARC中strong、weak、unsafe_unretained的区别的相关文章

ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy)

ARC声明属性关键字详解(strong,weak,unsafe_unretained,copy) 在iOS开发过程中,属性的定义往往与retain, assign, copy有关,我想大家都很熟悉了,在此我也不介绍,网上有很多相关文章. 但是在iOS 5中加入ARC,产生了几个新的关键字strong, weak, unsafe_unretained.  我们可以将其与以前的关键字对应学习: strong与retain类似,weak和unsafe_unretained这两个新关键字与assign类

ios中strong, weak, assign, copy

copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是copy,那copy与strong的情况下到底有什么区别呢? 比如: @property (retain,nonatomic) NSString *rStr; @property (copy, nonatomic)   NSString *cStr; - (void)test: { NSMutabl

strong,weak,assign的区别

使用assign:对基础数据类型(NSInteger)和C数据类型(int,float,double,char等).使用copy:对NSString:使用retain(引起引用计数加1):对其他NSObject(实例对象)和其子类: 属性关系有两种主要类型:strong和weak,相当于非ARC环境里的retain和assign.只要存在一个强引用,对象就会一直存在,不会被销毁. Objective-C中一直存在循环引用的问题,但在实际应用中很少出现循环引用.对于过去那些使用assign属性的地

学习IOS开发UI篇[email&#160;protected]中strong,weak参数的设定及runloop机制

[email protected]的参数说明 ======================================== ARC是苹果为了简化程序员对内存的管理,推出的一套内存管理机制 使用ARC机制,对象的申请和释放工作会在运行时,由编译器自动在代码中添加retain和release 1> strong:强指针引用的对象,在生命周期内不会被系统释放 在OC中,对象默认都是强指针 2> weak:弱指针引用的对象,系统会立即释放 弱指针可以指向其他已经被强指针引用的对象 @propert

ios OC 关键字 copy,strong,weak,assign的区别

一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(strong,nonatomic)NSMutableString*strongMStr; @property(weak,nonatomic)NSMutableString*weakMStr; @property(assign,nonatomic)NSMutableString*assignMStr; NSMu

ARC 之 strong and weak---【持续整理】

在iOS开发过程中,MRC情况下,属性的定义往往与retain, assign, copy有关. 在iOS5中新的关键字strong, weak, unsafe_unretained. 可以与以前的关键字对应学习strong与retain类似,weak与unsafe_unretained功能差不多(有点区别,等下会介绍,这两个新 关键字与assign类似).在iOS5中用这些新的关键字,就可以不用手动管理内存了,从java等其它语言转过来的程序员非常受用. __weak, __strong 用来

对于atomic nonatomic assign retain copy strong weak的简单理解

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic后setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} 2)n

iOS strong &amp; weak 简析

不用arc的话strong weak 相当于: strong 用来修饰强引用的属性: @property (strong) SomeClass * aObject; 对应原来的 @property (retain) SomeClass * aObject; 和 @property (copy) SomeClass * aObject; weak 用来修饰弱引用的属性:@property (weak) SomeClass * aObject; 对应原来的 @property (assign) So

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

来源:网络 assign: 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用.不更改索引计数(Reference Counting). 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain:保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 .我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用