内存泄漏 : 应当废弃的对象在超出生命周期后继续存在
内存管理 : 遵守配对原则,有alloc/new/copy/mutableCopy就要有相对应的release或autorelease
原因 : Oc对象是在堆里面的(动态分配),堆里面的内存由我们程序员来管理 ;
对象操作 |
Objective –c 对应方法 |
生成并持有对象 |
alloc/new/copy/mutableCopy等 |
持有对象 |
retain 方法 |
释放对象 |
release方法 |
废弃对象 |
dealloc方法(系统自动调) |
内存管理的思考方式 (文中“自己”表示 : “对象的使用环境”或“开发人员”):
1.自己生成的对象,自己持有
2.非自己生成的对象,自己也能持有
3.不再需要自己持有的对象时释放
4.非自己持有的对象无法释放
总结 :
1.调用alloc或是retain方法之后,引用计数值 + 1
2.调用release方法之后,引用计数值 - 1
3.当引用计数值为0时,调用dealloc方法废弃对象
4.调用retianCount,可以返回引用计数器的个数
多对象内存管理步骤:(使用@property就会生成下面的set方法)
1.在set方法中调用传进来的参数 retain方法
-(void)setRoom(Room*)room
{
if(_room != room){//判断传进来的对象是否是当前的对象
[_room relase];//释放掉当前的对象
_room = [room retain];//引用新的对象,赋值
}
2.在dealloc方法中调用release
-(void)dealloc
{
[_room release];
_room = nil;
[super dealloc];
}
autorelease 使用方法:
- 生成并持有NSAutoreleasePool对象(@autoreleasePool)
- 调用已分配对象的autorelease实例方法(retainCount不会增加,只是放在释放池中而已)
- 废弃NSAutoreleasePool对象
#import和@class的使用 :
#import :包含所有的信息,包含引用类的变量和方法
@class : 可以简单地引用一个类(仅仅告诉编译器,这个是一个类)
@class和#import的主要区别 : #import的内容改变了就要拷贝一次。
如何使用 :
(1)在.H文件中使用@class
(2)在.M文件中是用得是#import,真正使用的时候才要#import
解决相互引用(retain): 一端用retain,一端用assign
常见知识点或注意点:
(1)刚创建一个对象的计数器就为1
(2)重写deallloc方法的时候 : [super dealloc]必须放在最后面
(3)如果释放了对象,把所指向的地址赋值为nil,可以防止野指针操作
(4)给空指针发送消息是不会出错的,没有什么现象
(5)调用retain方法会返回对象本身
(6)指针赋值并没有调用retain,需要手动调用retain
(7)@property 生成set方法已经实现了上面的set方法和get方法,assign是默认的写法
(8)取得一个非自己生成并自己持有的对象 : id obj=[NSMutableArray array]; 持有对象 : [obj retain];(类方法里面自动调了autorelease)
(9)如果使用非自己持有的对象,这个程序会崩溃。
(10)__weak (只能用于ios5以上):可以避免循环引用,__修饰的变量不持有对象
(11)占用内存较大的不要放在autoreleasepool,性能问题
(12)重写alloc 方法的时候一定要使用self,这样子类也可以创建相对应的对象
(13)instancetype,比id更加智能,可以在编译的时候就可以发现问题
(14)如果直接使用 __weak UIView * view = [[UIView alloc]init];会发出警告 : Assigning retained object to weak variable……
(15)弱应用优点 : 在持有某对象的弱引用的时,若该对象被废弃,则弱引用将会自动失效且处于nil(被赋值的状态)相对于__unsafe_unretained更安全
(16)非OC对象是放在栈中,指针变量(4个字节)存在栈中
(17) A.h里#import “B”,B.h里#import “A”,导致错误 (Unknown type name……)