ARC:
由于自己的学习视频太早,Xcode是iOS6版本,新建命令行项目后,系统会默认启动ARC机制,全程Automatic Reference Counting,简单的说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。--所以自己在学习内存管理的时候为对象进行retain或者release的时候编译器总会报错。
必须注意的是:ARC并不是GC(垃圾回收机制),它只是一种代码静态分析(Static Analyzer)工具。
解决办法:由于版本不一样,解决办法的操作方式也不一样。踏破铁鞋无觅处,终于找到了适合自己的
按照步骤来,第一步点击项目名称, 第二步点击buid settings,第三步再输入框输入Automatic Reference Counting,在下面会搜索出来第四步,所示,将yes改为no。
第二步,如果你点的不是buid settings,那么你就搜索不出来任何设置项。
复制的时候注意,如果实在不行,可以复制中间的Reference,搜索出来好几个设置项,然后选择第四步所示。
一、内存管理原则:
1.只要你调用了alloc、new创建了一个新对象,那么你就有责任做一次release
2.只要你调用了retain,那么你也有责任做一次release
3.不能再操作已经被释放的对象,不然会发生野指针错误
4.在对象被释放之前,才能操作对象
5.计数器有加就应该有减
二、开启Xcode野指针调试功能:
1.点击左上角Stop按钮右边的项目名称
2.Edit Scheme
3.Diagnostics
4.勾选Objective-C的Enable Zoombie Objects
三、成员变量的内存管理(如果成员变量是对象,才需要管理):
注意两点:
1.set方法的管理
* release旧的成员变量,retain新的成员变量
2.delloc方法的管理
* release成员变量
四、代码实例:
Person.h文件:
//
// Person.h
// 15-内存管理03-对象之间的内存管理
// #import <Foundation/Foundation.h>
#import "Dog.h"
#import "Card.h" @interface Person : NSObject
{
Dog *_dog;
Card *_card;
int _age;
} - (void) setDog:(Dog *)dog;
- (Dog *) dog; - (void) setCard:(Card *)card;
- (Card *) card; - (void) setAge:(int)age;
- (int) age; @end
Person.m文件:
//
// Person.m
// 15-内存管理03-对象之间的内存管理
// #import "Person.h" @implementation Person //_age 成员变量不是对象,所以不用管理
- (int)age
{
return _age;
} - (void)setAge:(int)age
{
_age = age;
} //set方法的管理
//release旧的成员变量,retain新的成员变量
- (void)setCard:(Card *)card
{
if (card != _card)//判断是否为旧的成员变量
{
[_card release];
_card = [card retain];
}
} - (Card *)card
{
return _card;
} - (void)setDog:(Dog *)dog
{
if (dog != _dog)
{
[_dog release];
_dog = [dog retain];
}
} - (Dog *)dog
{
return _dog;
} - (void)dealloc
{
//Person在拥有card对象时,在set方法retain,所以在Person对象释放之前,将由Person的dealloc方法来释放card对象
//"谁污染,谁治理"
[_card release];
[_dog release];
NSLog(@"Person被销毁了");
[super dealloc];
}
@end