您的位置:首页 > 其它

关于oc中内存管理问题

2014-03-26 18:35 344 查看
一 .  不用Xcode的ARC,也就是内存管理自动管理,我们自己管理。

如果只是单纯的开辟一块空间,只要记得release就行了。例如

int main(){
Person *p=[[Person alloc] init];
[p release];

return 0;
}


如果一个类的成员变量是对象,例如
interface Person:NSObject{
Car *car;
}
那我们Person对象就要负责管理car的内存
注意两点,一个是setter方法,一个是dealloc方法  例如

interface Person:NSObject{
{
Car *_car;     //Car是一个类
}
-(void) setCar:(Car *)car;
-(Car *) car;
}


implementation Person{
-(void) setCar:(Car *)car{
if(_car != car){
[_car release];                //先把旧指释放了,在赋新值,并且计数器+1
_car = [car retain];
}
}
-(Car *)car{
return _car;
}
-(void) dealloc{
[_car release];
[super dealloc]; //这个父类的dealloc是必须调用的
}
}


int main(){
Person *p = [[Person alloc] init];
Car *car = [[Car alloc] init];
p.car =car;          //相当于[p setCar:car]
[car release];
[p release];
return 0;
}

这样就做完了,这就是一个模板,任何对象嵌套对象都可以这样实现,当然这是在自己管理内存的情况下,这样做既不内存泄露,又符合内存管理的原则,哪里alloc哪里release

二    不过现在Xcode功能很强大,不需要自己这么管理内存,使用@property,Xcode就可以自己管理。

interface Person:NSObject{
@property (nonatomic,retain) Car *car;   //retain参数就是相当于我省略的代码,retain就是让系统自己实现对象嵌套对象的内存管理
}
但是下面的dealloc方法是必须重写的
implementation Person{
-(void) dealloc{
[_car release];
[super dealloc]; //这个父类的dealloc是必须调用的
}
}
int main(){
Person *p = [[Person alloc] init];
Car *car = [[Car alloc] init];
p.car =car;          //相当于[p setCar:car]
[car release];
[p release];
return 0;
}


这样做就完了,以后在遇见对象嵌套对象的,就按照这样的来写,方便简单,永远记住:哪里alloc哪里release

附:关于@autorelease

@autorelease是根据@autoreleasepool来写的,例如

Person *p = [[[Person alloc] init] autorelease];
就相当于

Person *p = [[Person alloc] init];
[p release];


即延期释放,当自动释放池@autoreleasepool回收的时候,调用release,使对象p的计数器-1
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xcode 内存管理