1.对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)
2.对于assign:也有weak的功效。assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。
经过一番研究,发现如果使用
@property (nonatomic, assign, readwrite) id delegate;
声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址,即delegate成为了一个野指针...
3.对于weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。
而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil,
所以答案就是,使用weak。
@interface MyObject : NSObject
{
myBlock blk;
id _obj;
}
@end
@implementation MyObject
- (id)init
{
self = [super init];
blk = ^{ NSLog(@"_obj = %@", _obj); };
return self;
}
@end
上面的例子中,虽然没有直接使用 self,却也存在循环引用的问题。因为对于编译器来说,_obj就相当于self->_obj,所以上面的代码就会变成
blk = ^{ NSLog(@"_obj = %@", self->_obj); };
内存管理是程序设计中很重要的一部分,程序在运行的过程中消耗内存,运行结束后释放占用的内存。如果程序运行时一直分配内存而不及时释放无用的内存,会造成这样的后果:程序占用的内存越来越大,直至内存消耗殚尽,程序因无内存可用导致崩溃,这样的情况我们称之为内存泄漏。
在ObjC中,对象什么时候会被释放(或者对象占用的内存什么时候会被回收利用)?
答案是:当对象没有被任何变量引用(也可以说是没有指针指向该对象)的时候,就会被释放。
ARC能帮我们简化内存管理问题,但不代表它是万能的,还是有它不能处理的情况,这就需要我们自己手动处理,比如循环引用、非ObjC对象、Core Foundation中的malloc()或者free()等等
4.4 无限循环
这个是比4.3更极端的情况,无论你出于什么原因,当你启动了一个无限循环的时候,ARC会默认该方法用不会执行完毕,方法里面的对象就永不释放,内存无限上涨,导致内存泄漏。
例子:
网友评论