内存管理,@property和@synthesize

OC中不会自动回收内存,需要自己管理。
三种方式
retain和release 手动管理
autorelease   半自动管理

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; 
	}
}

在dealloc中release对象中。没有释放的对象。释放完毕后,记得调用父类的dealloc
例如:(模版)

-(void)dealloc{
	
	[book release];// 类中使用的对象变量。也可以self.book=nil;
	[super dealloc];
}

常见错误 EXC_BAD_ACCESS 野指针错误

autorelease   半自动管理
OC内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。
当自动释放池销毁时,池里面的所有对象都会调用依次release方法

// @qutoreleasepool创建一个自动释放池
@qutoreleasepool{
	Student *stu=[[[Student alloc] init]autorelease];
	Student *stu1=[[Student alloc] init];
	[stu1 autorelease];

// 自动释放池销毁了。那么这个池里的对象计数器-1
}

ios5.0后

@autoreleasepool{
...
}

ios5.0前
NSAutoreleasePool *pool=[[NSAutoreleasePoolalloc]init];
...
[pool release];//或[pool drain];


自定义静态方法生成对象

+(id)student{
	Student *stu=[[[Student alloc]init] autorelease];
	return stu;
}

ARC 管理内存
在ARC下

@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;

Student.m

@implementation Student
// 编译器自动实现getter和setter方法实现
// @synthesize 默认会去访问跟age同名的变量
// 如果找不到同名的变量,会自动生成一个同名的变量
// age=_age代表getter和setter会去访问_age这个成员变量(此时age不会自动生成)
@synthesize age=_age;
// 如果手动实现了。set,get方法,则不会自动生成
@end

#pragma mark -(加-可以分组快速定位) 注释内容。 (可以快速定位)。

在.h中用@class 类名。
在.m中用#import 类名。
@class还可以防止递归导入
如果继承某个类,就要导入类的头文件
如果只是定义成员变量、属性、用@class



你可能感兴趣的:(内存管理,@property和@synthesize)