黑马程序员——Objective-C——内存管理、ARC

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———


一、内存管理

1.管理范围:

任何继承了NSObject的对象,对其他基本数据类型(int、char、float、double、struct、enum等)无效

2.计数器基本操作

1> retain: +1;

2> release: -1;

3> retaincount : 获取计数器

3.set方法的内存管理

1>set方法的实现

- (void)setDog:(Dog *)dog
{
	if (_Dog!=dog)  // 判断是不是原对象
	{
		[_dog release];  // 对就对象release
		_dog = [dog retain];  // 设置新属性,并retain一次
	}
}

2>delloc方法的实现

- (void)dealloc  // dealloc方法不要直接调用,都是系统自动调用
{
	[_dog release];  // 对对象所拥有的对象属性release一次
	[super dealloc]; // dealloc方法中必须调用父类的dealloc方法
}

3.@property参数

1> 非OC类型的参数(char/int/float/double/struct)

@property (nonatomic,assign) 类型名 属性名;
@property (nonatomic,assign) int age;

2>OC类型

@property(nonatomic ,retain) 类名 *对象名  // retain:release旧值,retain新值
@property(nonatomic,retain) Dog *dog;
@property(nonatomic ,retain) id obj; //id类型是不需要加*的
// 注意:retain参数的属性,必须在dealloc中release

3>其他:

a. readwrite :同时生成set和get方法 // 可读可写

b. readonly: 只生成get方法 // 只读

c. atomic: 性能低(默认)

d. nonatomic: 性能高

e. setter: 设置set方法名

f. getter:设置get方法名

4>循环retain的情况

两端互相引用,如果都是retain参数会导致对象无法被释放,解决方法是一段用retain,一段用assign

4.autorelease

1>系统自带的创建对象方法,如果没有alloc、new、copy就不需要release

例如:

[NSString stringWithFormat:@”age id %d”,10];
NSString *name = @”jack”;

2>开发中用类方法快速创建的autorelease的对象,对象创建时不要用类名,用self以便子类调用时创建的是子类对象。

+ (id) person
{
	return  [[[self alloc] init] autorelease];  // 不要用Person 
}

5.内存管理原则

1>谁创建谁release

2>谁retain,谁release

 

二、ARC

1.原理

只要没有强指针指向对象,那么对象就会被释放。

2.强指针和弱指针

强指针(strong):默认情况下对象都是强指针,但是写属性一般也要写上strong

弱指针(weak):弱指针指向的对象被清空后,弱指针自动变为nil指针,不会引发野指针错误。(错误写法:__weak Person *person = [[Person alloc] init];)

3.注意点

1>ARC环境下不能调用retain、release、autorelease、retainCount

2>dealloc中不可以调用[superdealloc];

3>@property参数:如果要长期拥有某个对象就用strong,否则用weak

4>两端互相引用的情况,解决方案是:一段用strong,一段用weak








你可能感兴趣的:(Objective-C)