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。
版权声明:本文为博主原创文章,未经博主允许不得转载。