为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

DIEA 2019-04-14 11:28:34
刚学objectivec,遇到内存管理问题,情景是这样的:启用了arc,设定了一个Person类,只有一个weak的property,(NSMutableArray*)favorPerson.h如下#import@interfacePerson:NSObject@property(nonatomic,weak)NSMutableArray*favor;@endPerson.m如下#import"Person.h"@implementationPerson-(void)dealloc{NSLog(@"Persondealloc!");}@endmain.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,那它是怎么决定的呢?
查看完整描述

2 回答

?
萧十郎

TA贡献1815条经验 获得超13个赞

当该内存空间没有指针指向它了,它就被自动释放了。
p.favor=arr;
arr=nil;
arr是强引用,已经被置nil了,p.favor自然也就找不到相应内存地址了,所以输出(null)。
                            
查看完整回答
反对 回复 2019-04-14
  • 2 回答
  • 0 关注
  • 300 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号