码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2015-08-14 22:49:30      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:内存管理   class   property   autorelease   

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新的值  所以,如果你在一个类中定义的是基本数据类型如:@property int age  。这时候不需要任何操作,其中已经包含assign操作(直接赋值),但是如果类中定义的是一个OC 对象,那么你需要用retain如:@property  (retain ) Student *stu;

 

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

Readonly  :只生成getter的方法

Readwirte :setter getter的方法都生成

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 ,系统只是把该对象放入了当前autorelease pool 中,当该pool被释放时,该pool中的所有对象会被调用release。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:内存管理   class   property   autorelease   

原文地址:http://blog.csdn.net/u012989536/article/details/47668065

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!