標籤:
如果你使用過MRR,autorelease這個關鍵字應該是太熟悉了,每次在我們產生一個新的對象返回時,都需要向這個對象發送autorelease訊息,目的是為了延時釋放建立的對象。那到底是在什麼時候,這個對象會被釋放呢?有什麼方法可以更快的釋放一個autorelease對象呢?
咱們先來看一個現象:
@property (weak, nonatomic) NSString *weakString;- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. NSString *hello = [[NSString alloc] initWithCString:"it will be released at the end of current runloop" encoding:NSUTF8StringEncoding]; self.weakString = hello; NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd));}- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd));}- (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; NSLog(@"%@ - %@", self.weakString, NSStringFromSelector(_cmd)); dispatch_async(dispatch_get_main_queue(), ^{ NSLog(@"-2--%@ - %@", self.weakString, NSStringFromSelector(_cmd)); });}
我們建立了一個viewDidLoad方法中建立了一個weak指標指向一個字串,當代碼執行到viewWillAppear:和viewDidAppear:時,我們依然可以列印出weak指標指向的字串,當在viewDidAppear:中在下一個runloop中執行列印操作時,weak指標就指向nil了,Why ?
我們完全可以這麼翻譯這條語句到MRR:self.weakString = hello
self.weakString = [[hello retain] autorelease];
這樣看,我們是不是可以猜測autorelease的對象是在當前的runloop結束後就被釋放掉了呢?
我們要釐清的事情可能有以下幾個方面:
1)autorelease pool
Objective-c中autorelease的釋放時機