__strong 是id类型和所有对象类型默认的所有权修饰符
__strong 表示对对象的强引用,在ARC中持有强引用变量在超出其作用域或强引用失效(如被置为nil),则引用对象被自动释放
第二、实例内存分析
id __strong obj1=[[NSObject alloc] init]; /* create object A */
/*
* obj1持有对对象A的强引用
*/
id __strong obj2=[[NSObject alloc] init]; /* create object B*/
/*
* obj2持有对对象B的强引用
*/
id __strong obj3=nil;
/*
*obj3不持有任何对象
*/
obj1=obj2;
/*
* obj1持有对对象B
* 对象A没有持有者,因此A释放
*/
obj3=obj1;
/*
* obj1,ojb2,obj3共同持有对象B
*/
obj1=nil;
/*
* ojb2,obj3共同持有对象B
*/
obj2=nil;
/*
* obj3共同持有对象B
*/
obj3=nil;
/*
* 对象B没有持有者,故释放
*/
第三、总结:
自己生成的对象,自己持有
非自己生成的对象,自己也能持有
不再需要自己持有的对象时释放
第四、__strong循环引用带来的内存泄露
@interface Test : NSObject
{
id __strong _obj;
}
-(void)setObject:(id __strong)obj;
@end
#import "Test.h"
@implementation Test
-(id)init{
self=[super init];
if (self) {
}
return self;
}
-(void)setObject:(id)obj
{
_obj=obj;
}
-(void)dealloc{
//[super dealloc];
NSLog(@"Test");
}
@end
#import "Test.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Test *obj1=[[Test alloc] init];
/*
* obj1 持有对象A
*/
Test *obj2=[[Test alloc] init];
/*
* obj2 持有对象B
*/
[obj1 setObject:obj2];
/*
* obj1,obj2 持有对象B
*/
[obj2 setObject:obj1];
/*
* obj1,obj2 持有对象A
*/
/*
循环引用容易发生内存泄露
*/
}
return 0;
}
解决方法使用weak,详情见下篇