您的位置:首页 > 其它

Multithreading and memory 读书笔记---_strong修饰词

2016-06-26 07:52 155 查看
_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方法,当然第四条也满足。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  读书笔记