第四天:内存管理-property参数

来源:互联网 发布:mac airplay显示器关闭 编辑:程序博客网 时间:2024/06/07 03:39

1.通常引用一个类有两种方法:

1,通过#import方法引入

2.通过@class引入

 

#import @class的区别:

 

 

#import "B.h"@interface A:NSObject {B *b;}@end

 

1.#import方式会包含被引用类的所有信息,包括被引用类的变量和方法。@class方式只是告诉编译器在a.h文件中B *b只是类的声明,具体这个类里有什么信息,这是不需要知道,等实现文件中真正用到的是否,才会去查看B类中信息。

 

2.使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在现实类由于要用到被引用类中的实现变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件。

 

3.如果有些文件一次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要从新编译一遍,这样的效率也是可想而知的。而相对来讲,使用@class凡是就不会出现这种问题。

 

 

 

 

 

4.内存管理_property 参数:

(当一个类中的成员变量中有很多的OC对象的是否,这时候对于对象之间的管理内存问题会很麻烦,特别是在setter方法里面,这时候,编译器就引入了property的retain参数,来进行管理内存。

 

1.retain:如果property里面有retain参数,那么编译器在setter方法里面,编译器会自动加上,先release旧值,然后再retain新的值 所以,如果你在一个类中定义的是基本数据类型如:@propertyint age 。这时候不需要任何操作,其中已经包含assign操作(直接赋值),但是如果类中定义的是一个OC对象,那么你需要用retain如:@property  (retain ) Student *stu;

 

Assign默认类型,setter方法直接赋值,不进行retain操作。

Readonly :只生成getter的方法

Readwirte :settergetter的方法都生成

copy:setter方法release旧值,再copy新值。

atomic默认属性:提供多线程安全。,代表给方法加锁,保证线程安全(耗性能)

nonatomic,代表方法不需要考虑线程安全问题。

 

注意:基本上所有的属性都是nonatomic类型,不需要考虑atomic,因为性能问题。

 

 

property里面还可以指定setter和getter方法的名字,例如:@property(setter =  setAge,getter =  getAge) int age; 这样就指定了setter和getter方法:

 

 

5.自动释放池:

OC里面的一种内存自动回收机制,一般可以将一些临时变量放到自动释放池里面去,统一回收释放

当自动释放池销毁的时候,池里面的所有对象都会调用一次release方法:

 

OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中,(栈顶的释放池)

 

Autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前autoreleasepool中,当该pool被释放时,该pool中的所有对象会被调用release。

 

1 0
原创粉丝点击