剛學(xué)objectivec,遇到內(nèi)存管理問題,情景是這樣的:啟用了arc,設(shè)定了一個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);}控制臺打印的結(jié)果是這樣的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的,那么當(dāng)arr=nil時,這個對象就沒有強指針指向它了,此時該對象應(yīng)該被釋放,但是第二次打印的結(jié)果表明并沒有被釋放再但是,當(dāng)我注釋掉第一次的打印,即#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);}打印結(jié)果卻是2015-09-1113:44:48.956Prog1[36117:210004](null)2015-09-1113:44:48.958Prog1[36117:210004]Persondealloc!即表明對象被釋放了我的問題是:啟用了arc后,對象在沒有強指針(強引用)的情況下是否被立即釋放?如果不是,是什么時候釋放?(注意我用init開頭的方法創(chuàng)建的數(shù)組對象,在非arc情況下是不會autorelease的,main函數(shù)中我也沒有@autoreleasepool)點語法是否會影響對象釋放?(我提這個問題的原因是,當(dāng)我不用property而是把favor設(shè)為@public的成員變量時,用p->_favor打印第一次就不會出現(xiàn)arr=nil后沒有被釋放的情況)arc到底是怎樣決定何時釋放對象的呀?我知道arc是編譯時就決定了何時releaseretainautorelease,那它是怎么決定的呢?
xcode中啟用了arc后,是何時釋放對象?
慕標(biāo)琳琳
2019-04-19 16:29:20