arc 自动管理
手动管理 retain和release
任何继承了NSObject的对象,对基本数据类型无效。对静态方法生成的对象,不用管理。(一般都被声明了autorelease)
原理:每个对象内部都有一个与之相关的整数(引用计算器)
使用 alloc new 或copy创建一个对象是,引用计算器+1
给对象发送一条retain消息, 引用计算器+1
给对象发送一条release消息,引用计算器-1
retainCount消息获得当前的引用计算器值
当引用计算器为0时,对象被销毁,内存被祸首。OC也会自动向对象发送一条dealloc消息。
一般会重写dealloc方法,释放相关资源,一定不要直接调用dealloc
野指针:指针指向了,内存已经被回收了的对象
使用总结:
有alloc new 或copy 就要有。release.(不能release多次,会造成野指针错误)
类中有set方法,给对象赋值。
例如:(模版)
例如:(模版) -(void) setBook:(Book *)book{ if(_book!=book){ // oc中不会有空指针报错 // 先释放旧的成员变量 [_book release]; _book=[book retain]; // [book retain]; // _book=book; } }
-(void)dealloc{ [book release];// 类中使用的对象变量。也可以self.book=nil; [super dealloc]; }
autorelease 半自动管理
OC内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。
当自动释放池销毁时,池里面的所有对象都会调用依次release方法
// @qutoreleasepool创建一个自动释放池 @qutoreleasepool{ Student *stu=[[[Student alloc] init]autorelease]; Student *stu1=[[Student alloc] init]; [stu1 autorelease]; // 自动释放池销毁了。那么这个池里的对象计数器-1 }
@autoreleasepool{
...
}
ios5.0前
NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];
...
[pool release];//或[pool drain];
自定义静态方法生成对象
+(id)student{ Student *stu=[[[Student alloc]init] autorelease]; return stu; }
@property和@synthesize
Student.h
@interface Student : NSObject{ // 当编译器遇到@property时,会自动展开getter和setter方法声明。 // Xcode 4.5之后可以省略@synthesize ,并且默认会去访问_age这个成员变量 //如果找不到_age会自动生成一个叫_age的私有成员变量; //自己写了setter和getter方法就不会自动生成变量了,只写了setter没写getter还是会自动生成变量的 @property int age; @end 注:@property (参数,参数2) 变量类型 变量名; 参数主要分为3类 // readonly 只生成getter方法。 读写属性:readwrite(默认)/readonly setter处理:assign(默认)/retain/copy // atomic代表给方法进行加锁,保证线程安全/nonatomic不需要线程安全 原子性:atomic(默认)/nonatomic 例如: // 这里的retain代表:release旧值,retain新值 @property (retain) Book *book; // getter是用来指定get方法的方法名 @property (nonatomic ,getter=isRich) BOOL rich;
@implementation Student // 编译器自动实现getter和setter方法实现 // @synthesize 默认会去访问跟age同名的变量 // 如果找不到同名的变量,会自动生成一个同名的变量 // age=_age代表getter和setter会去访问_age这个成员变量(此时age不会自动生成) @synthesize age=_age; // 如果手动实现了。set,get方法,则不会自动生成 @end
#pragma mark -(加-可以分组快速定位) 注释内容。 (可以快速定位)。