变量修饰符,主要用来标识对象的生命周期.在手动内存管理方式中没有这些概念.
ARC 环境下变量所有权修饰符主要有以下几个:
__strong
__weak
__unsa_unretained
__autoreleasing
详细说明:
(1) 变量默认值都是__ strong 修饰
只要强引用存在,对象就不能释放.当超过了对象的作用域以及没有强引用时,对象会自动销毁.
_strong 属性基本上能适应 ARC 环境下的所有情况.如果不写的话,默认为_ strong 属性.
(2) __weak 不持有对象,只是简单地引用而已.
也就是说,_weak不会影响对象的销毁,只要__weak 修饰的对象没有强引用时,就会自动销毁,这时候_ weak 变量会自动设置成 nil.
下面是一个例子
NSString *__weak str = [][NSString alloc] initWithFormat:@"I am studying"];
NSLog (@"str : %@",str);
因为 str 这个对象是弱引用,编译器会提示,这是一个弱引用,输出的结果: str:null
在你打开ARC时,你是不能使用retainrelease autorelease 操作的,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了,但是你需要在对象属性上使用weak 和strong, 其中strong就相当于retain属性,而weak相当于assign,基础类型还是使用assign。
当使用如:arrayWithCapacity这样的方法获取临时对象的时候,你不必考虑内存释放问题。
[NSColor blueColor]; 单例对象,永远不会被销毁,但是你也不必考虑它的内存问题。
如果在你自定义的类中依赖其它对象时,你需要重写dealloc方法,并且在这个方法中释放依赖的对象
如果在设计的循环体中会占用较多的内存空间,建议手动创建自动释放池。如:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
for ( int i = 0; i < 1000000; i++) {
id object = [someArray objectAtIndex:i];
NSString *desc = [object description];
// and do something with te descripton
if ( i % 100 == 0) {
[pool release];
pool = [[NSAutoreleasePool alloc] init];
}
}
所有权归属问题
NSString *theString = @"Hello,Henan";
CFStringRef cfString = (CFStringRef)theString
// __bridge
cfString = (__bridge CFStringRef)theString //指针的所有权不变,所以是 theString
// __bridge_retained
cfString = (__bridge_retained CFStringRef)theString// 指针的所有权对象是 cfString
// __bridge_transfer
cfString = (__bridge_transfer CFStringRef)theString// 指针的所有权属于 theString
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/www_nyp_boke/article/details/46700231