------<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 (常用方法)