_strong修饰词
_strong修饰词是默认的修饰词,用于修饰id和对象。
(1)对于变量
id obj =[ [NSObject alloc] init];等价与id _strong obj=[[NSObject alloc] int];而且与非ARC下的 id obj =[ [NSObject alloc] init];相同
(2)对于局部变量来说,下面代码相同
ARC下
{
//创造一个对象并且拥有它
id _strong obj = [[NSObject alloc] init];
//变量obj被_strong修饰,意味着obj拥有对象的所有权
}
//离开变量obj的区域,obj对对象的强引用消失,object被自动调用,没有对对象的强引用,对象被清除。
non-ARC 下
{
id _strong obj = [[NSObject alloc]init];
[obj release];
}
在ARC下,“release”方法是自动调用,当控制流离开变量obj的区域,release方法被自动调用,因为变量obj是被_strong修饰的。
(3)没有创建就拥有或获得一个对象
{
//没有创建就拥有或获得一个对象
id _strong obj = [NSMutable array];
}
//离开变量obj的区域,obj对对象的强引用消失,object被自动调用,没有对对象的强引用
(4)被_strong修饰的变量可以交换值
id __strong obj0 = [[NSObject alloc] init]; //obj0对对象A有强引用,[[NSObject alloc] init]为对象A
id __strong obj1 = [[NSObject alloc] init]; //obj1对对象B有强引用
id __strong obj2 = nil;//obj2没有引用
obj0 = obj1; //obj0对对象B有强引用,对象A没有强引用所以清除a,obj0与obj1都指向b
obj2 = obj0;//obj0、obj1、obj2都指向b
obj1 = nil;
obj0 = nil;
obj2 = nil;
(5)成员变量和方法参数被_strong修饰
@interface Test : NSObject {
id _strong obj;
}
- (void)setObject:(id __strong)obj; @end
@implementation Test - (id)init
{
self = [super init];
return self;
}
- (void)setObject:(id __strong)obj
{
obj_ = obj;
}
@end
下面是使用
{
id __strong test = [[Test alloc] init];//test对Test 对象有强引用
[test setObject:[[NSObject alloc] init]]; //对象的成员变量obj_对NSObject实例对象有一个强引用
}
/*
* Leaving the scope of variable test, its strong reference disappears.
* The Test object is released.
* It is disposed of because no one has ownership. *
* When it is disposed of,
* The strong reference by its member obj_ disappears as well.
* The object of NSObject is released.
* It is disposed of because no one has ownership as well. */
(6)用_strong修饰的变量,满足引用计数
*你拥有你创建的对象的所有权
*可以使用retain来拥有一个对象
*当不再需要一个对象时,你必须释放你所拥有的对象
*你不能释放你没有拥有的对象
通过分配一个_strong变量满足了前两条;第三条离开变量区域自动调用release方法,当然第四条也满足。