Objective-C学习_内存管理学习笔记_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > Objective-C学习_内存管理学习笔记

Objective-C学习_内存管理学习笔记

 2015/4/20 13:32:56  唐福  程序员俱乐部  我要评论(0)
  • 摘要:内存泄漏:应当废弃的对象在超出生命周期后继续存在内存管理:遵守配对原则,有alloc/new/copy/mutableCopy就要有相对应的release或autorelease原因:Oc对象是在堆里面的(动态分配),堆里面的内存由我们程序员来管理;对象操作Objective–c对应方法生成并持有对象alloc/new/copy/mutableCopy等持有对象retain方法释放对象release方法废弃对象dealloc方法(系统自动调)内存管理的思考方式(文中&ldquo
  • 标签:笔记 学习 学习笔记 内存管理 内存

 

内存泄漏 : 应当废弃的对象在超出生命周期后继续存在

内存管理 : 遵守配对原则,有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 使用方法:

  1. 生成并持有NSAutoreleasePool对象(@autoreleasePool)
  2. 调用已分配对象的autorelease实例方法(retainCount不会增加,只是放在释放池中而已)
  3. 废弃NSAutoreleasePool对象

 

#import和@class的使用 :

#import  :包含所有的信息,包含引用类的变量和方法

@class      : 可以简单地引用一个类(仅仅告诉编译器,这个是一个类)

@class和#import的主要区别 : #import的内容改变了就要拷贝一次。

如何使用 :

(1)在.H文件中使用@class

(2)在.M文件中是用得是#import,真正使用的时候才要#import

(3)A.h里#import “B”,B.h里#import “A”,导致错误 (Unknown type name……)

 

解决相互引用(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个字节)存在栈中

发表评论
用户名: 匿名