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 下
{
在ARC下,“release”方法是自动调用,当控制流离开变量obj的区域,release方法被自动调用,因为变量obj是被_strong修饰的。
(3)没有创建就拥有或获得一个对象
{
(4)被_strong修饰的变量可以交换值
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方法,当然第四条也满足。
_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方法,当然第四条也满足。
相关文章推荐
- 只需十分钟,结果大不同 |《深度思考》
- 《洋葱阅读法》读书笔记
- Jquery实战_读书笔记1―选择jQuery
- JavaScript 精粹读书笔记(1,2)
- JavaScript 权威指南(第四版) 读书笔记
- Terry七月Ruby读书笔记(比较详细)第1/4页
- 整理java读书笔记十五之java中的内部类
- 从「林」开始--C++ primer 读书笔记 -- Part II: Containers ...
- 读书笔记-大型分布式网站架构-设计与实践【陈康贤】
- [读书笔记]Scrum 总结
- 大型网站架构系列:负载均衡详解
- 《穷爸爸,富爸爸》读书笔记
- 《程序员的职业素养》读书笔记
- sniff读书笔记
- 《Zabbix监控系统深度实践》读书笔记
- 《DevOps故障排除:Linux服务器运维最佳实践》读书笔记
- 重学JS 1
- 《javascript高级程序设计》读书笔记——引用类型之Object类型(细节整理)
- 《HTML重构》读书笔记&思维导图
- <读书笔记>软件调试之道 :问题的核心-诊断