猿问

xcode中启用了arc后,是何时释放对象?

刚学objectivec,遇到内存管理问题,情景是这样的:启用了arc,设定了一个Person类,只有一个weak的property,(NSMutableArray*)favor
Person.h如下
#import
@interfacePerson:NSObject
@property(nonatomic,weak)NSMutableArray*favor;
@end
Person.m如下
#import"Person.h"
@implementationPerson
-(void)dealloc{
NSLog(@"Persondealloc!");
}
@end
main.m如下
#import
#import"Person.h"
intmain(intargc,char*argv[]){
Person*p=[[Personalloc]init];
NSMutableArray*arr=[[NSMutableArrayalloc]initWithObjects:@"1",@"2",nil];
p.favor=arr;
NSLog(@"%@",p.favor);
arr=nil;
NSLog(@"%@",p.favor);
}
控制台打印的结果是这样的
2015-09-1113:31:14.408Prog1[32787:193921](
1,
2
)
2015-09-1113:31:14.409Prog1[32787:193921](
1,
2
)
2015-09-1113:31:14.409Prog1[32787:193921]Persondealloc!
我的分析是:arr刚开始指向的对象只有arr一个强指针指向它,虽然p.favor=arr,但favor属性是weak的,那么当arr=nil时,这个对象就没有强指针指向它了,此时该对象应该被释放,但是第二次打印的结果表明并没有被释放再但是,当我注释掉第一次的打印,即
#import
#import"Person.h"
intmain(intargc,char*argv[]){
Person*p=[[Personalloc]init];
NSMutableArray*arr=[[NSMutableArrayalloc]initWithObjects:@"1",@"2",nil];
p.favor=arr;
//NSLog(@"%@",p.favor);
arr=nil;
NSLog(@"%@",p.favor);
}
打印结果却是
2015-09-1113:44:48.956Prog1[36117:210004](null)
2015-09-1113:44:48.958Prog1[36117:210004]Persondealloc!
即表明对象被释放了
我的问题是:
启用了arc后,对象在没有强指针(强引用)的情况下是否被立即释放?如果不是,是什么时候释放?(注意我用init开头的方法创建的数组对象,在非arc情况下是不会autorelease的,main函数中我也没有@autoreleasepool)
点语法是否会影响对象释放?(我提这个问题的原因是,当我不用property而是把favor设为@public的成员变量时,用p->_favor打印第一次就不会出现arr=nil后没有被释放的情况)
arc到底是怎样决定何时释放对象的呀?我知道arc是编译时就决定了何时releaseretainautorelease,那它是怎么决定的呢?
DIEA
浏览 301回答 2
2回答

萧十郎

当该内存空间没有指针指向它了,它就被自动释放了。p.favor=arr;arr=nil;arr是强引用,已经被置nil了,p.favor自然也就找不到相应内存地址了,所以输出(null)。
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答