內存洩漏問題的解決
內存洩漏(Memory Leaks)是當一個對象或變量在使用完成後沒有釋放掉,這個對象一直占有著這塊內存,直到應用停止。如果這種對象過多內存就會耗盡,其它的應用就無法運行。這個問題在C++、C和Objective-C的MRR中是比較普遍的問題。 在Objective-C中釋放對象的內存是發送release和autorelease消息,它們都是可以將引用計數減1,當為引用計數為0時候,release消息會使對象立刻釋放,autorelease消息會使對象放入內存釋放池中延遲釋放。 上代碼: - (void)viewDidLoad { [super viewDidLoad]; NSBundle *bundle = [NSBundle mainBundle]; NSString *plistPath = [bundle pathForResource:@"team" ofType:@"plist"]; //獲取屬性列表文件中的全部數據 self.listTeams = [[NSArray alloc] initWithContentsOfFile:plistPath]; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath { static NSString *CellIdentifier = @”CellIdentifier”; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; } NSUInteger row = [indexPath row]; NSDictionary *rowDict = [self.listTeams objectAtIndex:row]; cell.textLabel.text = [rowDict objectForKey:@"name"]; NSString *imagePath = [rowDict objectForKey:@"image"]; imagePath = [imagePath stringByAppendingString:@".png"]; cell.imageView.image = [UIImage imageNamed:imagePath]; cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; return cell; } - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { NSUInteger row = [indexPath row]; NSDictionary *rowDict = [self.listTeams objectAtIndex:row]; NSString *rowValue = [rowDict objectForKey:@"name"]; NSString *message = [[NSString alloc] initWithFormat:@”您選擇了%@隊。”, rowValue]; UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@”請選擇球隊” message:message delegate:self cancelButtonTitle:@”Ok” otherButtonTitles:nil]; [alert show]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } 大家看看上面的3個方法會有什麼問題呢?如果代碼是基於ARC的是沒有問題的,遺憾的是基於MRR,上面的代碼都存在內存洩漏的可能性。理論上講內 存洩漏是對象或變量沒有釋放引起的,但實踐證明並非所有的未釋放對象或變量都會導致內存洩漏,這與硬件環境和操作系統環境有關,因此我們需要檢測工具幫助 我們找到這些“洩漏點”。 在Xcode中提供了兩種工具幫助查找洩漏點:Analyze和Profile,Analyze是靜態分析工具可以通過菜單 Product→Analyze啟動,為靜態分析之後的代碼畫面;Profile是動態分析工具,這個工具叫“Instruments”,它是Xcode 集成在一起,可以在Xcode中通過菜單Product→Profile啟動,Instruments有很多Trace Template(跟蹤模板)可以動態分析和跟蹤內存、CPU和文件系統。