黑马程序员——Objective--C笔记之内存管理(二)

来源:互联网 发布:南风知我意全文阅读 编辑:程序博客网 时间:2024/06/07 14:41

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

内存管理问题(二)

一 .多个对象内存管理问题

1.野指针问题

Person.h


Person.m


Car.h


Car.h


main.m


注意:如果车对象先释放,人就不能再开车了,如果人被销毁了车还没有被销毁就会造成内存泄漏

2.解决内存泄漏的问题:

保证在人对象释放的时候,让车对象也释放,人不释放车也不释放

二.set方法内存管理

对于对象作为另一个类的实例变量,set原对象无法释放造成的内存泄漏问题:在set方法里[—car retain ],应用计数器发生改变,在main.m里就算release了,计数器还剩1,如果这是你在传个新的对象过去,原来的对象就造成了泄漏。

判断传递的对象是否是原来的对象,如果不是原来的对象就先释放原来的对象,在赋值新的对象,在retain,如果是原来的对象则什么也不干


三.@property参数

1.格式:@property (参数1,参数2)数据类型  方法名

2.参数类型                             参数                                                     说明

   原子性                              atomic                               对属性枷锁,多线程下不安全,默认值

                                        nonatomic                          对属性不枷锁,多线程下不安全,但是速度快

    读写属性                           readwrite                          生成getter、setter方法   默认值

                                         readonly                            只生成getter方法

    set方法处理                      assign                                直接赋值,默认值

                                         retain                                  先release原来的值,再retain新值

                                         copy                                   先release原来的值,再copy新值

3.set方法处理:

1).assign  直接赋值,适用于非oc对象,默认

   例:@property(nonatomic, assign) int   age;

2).retain  先release旧值,再retain新值

   例:@property (nonatomic, retain) NSString  *name;

3).copy分为浅复制和深复制   先release原来的值,再copy新值

4.set和get的方法名称,主要用于布尔类型。因为返回布尔类型的方法名一般以is开头,修改名称一般用在布尔类型中的getter。 

1).替换set方法的名称:@property (nonatomic, setter = isVip:)

                                            [p setVip:YES];  -------->[p isVip=YES];

2).替换get方法的名称:@property(nonatomic,getter=isVip:)

                                           [p isVIP:YES];

四.@class的使用

1.格式:@class   类名

2.@class XXX      含义:告诉编译器,XXX是一个类,至于类有哪些方法和属性,此处不去检查

                              好处:如果XXX文件内容发生改变,而不需要重写编译

3.@class使用注意:

1).    .h     @class   XX;

2).    .m    #import   "XX.h"

@class的特殊用法可以解决循环引用问题

4.#import   和@class的区别

#import会包含引用类的所有信息(内容),包括引用类的属性和方法

@class仅仅是告诉编译器有这么一个类,具体类里面有什么信息,完全不知道

效率上的区别

如果有上百个文件都#import了同一个文件或者这些文件依次被#import,那么一旦开始的头文件有改动,后面引用了这个头文件的类都要重新编译,编译效率非常低,使用@class就不会出现这种问题。

5.循环retain会导致两个对象都会内存泄漏




两个对象互相指向对方,引用计数器都为1,对象不能释放造成内存泄漏

解决办法:

1).让某个对象多释放一次(注意顺序)

2).一端使用 assign   一端使用retain    (常用方法)











0 0
原创粉丝点击