只有对象 才需要内存管理,基本数据型类型不需要。
对象的 release、retain、retainCount方法说明:
release 引用计数-1
retain 引用计数+1,返回对象本身。 返回的类型是instancetype
retainCount 返回引用计数的数目
当引用计数归0后,会调用对象的 dealloc方法,所以在dealloc中需要释放成员属性对象的引用。
在子类的dealloc方法中,需要释放父类的成员,所以[super dealloc];
retain和release的使用
1.当一个对象alloc、new、[mutable]copy后就分配了内存,所以在使用完毕后,就release。 类似 [person release]
2.当调用对象的retain方法,使用完对象后,需要release
3.在set方法中,类似 - (void)setCup:(Cup*)cup; 如果跟内部成员不同,需要先release旧值,再retain参数:
- (void)setCup:(Cup*)cup {
if (cup != _cup) {
[_cup release];
_cup = [cup retain];
}
}
最后在持有cup属性的对象销毁时,即在该对象的dealloc方法中调用 [_cup release];
关于autoreleasepool
就是一个自动对象引用释放池,在早前呢,用NSAutoreleasePool,来创建一个池对象,再调用[pool addObject:obj]添加到池中。
池子 会在对象不使用后,自动发送一条release消息。 多次添加同一对象入pool,最后也会发送多次的release。
autorelease方法
Cup* cup = [[[Cup alloc] init] autorelease];
内部其实就是调用了NSAutoreleasePool的addObject方法。 会自动release
------------------------------------------------------------------------------------------------------------------------
以上为手动内存管理
以下为自动内存管理
iOS5.0(LLVM3.0)引入了 ARC(automatic reference counting),即能自动管理对象引用。自动retain,自动release。
Obj-C: (ARC) 使用ARC的注意事项
1. ARC不能解决非Objective-C的内存管理, 比如malloc(), 需要free()
2. ARC最低支持Xcode 4.2 和 iOS4
3. 通过(Edit > Refactor > Convert to Objective-C ARC)把已有的代码转换成ARC
4. ARC不能再使用retain, release, retainCount, autorelease, NSAutoreleasePool(用
@autoreleasepool代码块替代)
5. ARC不能在dealloc()中调用[super dealloc], dealloc()仍可用在删除注册的代理或通知等.
6. ARC不能处理在C struct中包含一个对象指针的情况, 应用Objective-C Class来封装.
7. 属性起名不可以用new开头
8. ARC可以兼容Obj-C++
9.不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)
10. id与void *间的如果cast时需要用特定的方法(__bridge关键字)
11.不能使用NSAllocateObject, NSDeallocateObjec
12.不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])
ARC加载非ARC文件时, 在Targets->Build Phases->Compile Sources中找到相应文件添加字段:
-fno-objc-arc
@autoreleasepool 代码块,一个代码块里的对象,在代码块结束时,会给内部的所有对象发送一次release消息。
代码块可以嵌套。