iOS開發那些事-效能優化–autorelease的使用問題
在MRR中釋放物件通過release或autorelease訊息實現,release訊息會立刻使引用計數-1釋放,傳送autorelease訊息會使物件放入記憶體釋放池中延遲釋放,物件的引用計數並不真正變化,而是向記憶體釋放池中新增一條記錄,直到當池被銷燬前會通知池中的所有物件全部傳送release訊息真正將引用計數減少。
由於會使物件延遲釋放,除非必須,否則不要使用autorelease釋放物件,在iOS程式中預設記憶體釋放池的釋放是在程式結束,應用程式入口main.m檔案程式碼如下:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
程式碼被包裹在@autoreleasepool {… }之間,這是池的作用範圍,預設是整個應用。如果產生大量物件採用autorelease釋放也會導致記憶體洩漏。那麼什麼時候autorelease是必須呢?我們看看下面程式碼:
- (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] autorelease];
}
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;
}
其中的cell物件不能馬上release,我們需要使用它設定表檢視畫面。autorelease一般應用於為其它呼叫者提供物件的方法中,物件在該方法不能馬上release,而需要延遲釋放。
此外,還有一種情況下使用了autorelease,即前文提到的“類級構造方法”:
NSString *message = [NSString stringWithFormat:@"您選擇了%@隊。", rowValue];
該物件的所有權雖然不是當前呼叫者,但它是由iOS系統通過傳送autorelease訊息放入到池中的,當然這一切對於開發者都是不可見的,我們也要注意減少使用這樣的語句。
相關文章
- app 效能優化的那些事APP優化
- app 效能優化的那些事(二)APP優化
- iOS-效能最佳化的那些事iOS
- iOS開發之MKMapView的效能優化iOSView優化
- iOS問題整理08----效能優化iOS優化
- 「前端那些事兒」② 極限效能優化前端優化
- iOS開發——專案實戰總結&UITableView效能優化與卡頓問題iOSUIView優化
- Android效能優化(六)之卡頓那些事Android優化
- iOS使用Instrument Time Profiler工具分析和優化效能問題iOS優化
- JavaScript模組化開發的那些事JavaScript
- 效能優化問題優化
- iOS開發那些事-Git在Xcode中的配置與使用iOSGitXCode
- MySQL優化那些事兒MySql優化
- iOS開發筆記(七):深入理解 AutoreleaseiOS筆記
- 優化案例--重建索引引發的sql效能問題優化索引SQL
- iOS效能優化iOS優化
- iOS開發過程中 效能監控及優化iOS優化
- 敏捷開發的那些事敏捷
- 關於sap效能優化的問題優化
- iOS 效能優化的探索iOS優化
- Lotus開發效能優化優化
- iOS開發那些事-響應記憶體警告iOS記憶體
- iOS CollectionView 的那些事iOSView
- iOS開發 自動釋放池(Autorelease Pool)和RunLoopiOSOOP
- Clojure 開發那些事
- iOS開發的那些坑iOS
- 記一個效能優化問題優化
- iOS效能優化:Instruments使用實戰iOS優化
- iOS 實際開發中對效能優化的幾點建議iOS優化
- IOS效能優化篇iOS優化
- iOS 效能優化套路iOS優化
- 一個SQL效能問題的優化探索SQL優化
- webpack4.0優化那些事兒Web優化
- 前端開發效能優化方案前端優化
- 『IOS』使用優雅的錨點開發iosiOS
- iOS App 開發的那些事兒 2:如何搭建合適的框架iOSAPP框架
- ios 面試那些事iOS面試
- [java][效能優化]java高階開發必會的50個效能優化Java優化