內存洩漏問題的解決
內存洩漏(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和文件系統。