2011-08-21 5 views
0

最近、objective-Cとココアの学習を開始しました。私は徐々にメモリ管理について学び始めています。通常私はちょっとそれの論理を把握します。しかし、今はちょっと混乱しています。ここに私の問題があります:入力時にUISearchDisplayControllerのメモリリークがスタックアップする

私は検索機能付きの簡単なアイオスアプリを作ろうとしています。私はそれに何かを入力すると地獄のような(機器.. ..)リークUITableViewController内のUISearchbarのUISearchDisplayControllerがありますコンパイラとアナライザの両方に警告やエラーは表示されません。ちょうど楽器。

私はhandleSearchTermメソッド内でこの行からのエラーを取得:

- (void)handleSearchForTerm:(NSString *)searchTerm 
{ 
    self.savedSearchTerm = searchTerm; 
    if ([self searchResults] == nil) 
    {  

     NSMutableArray *array = [[NSMutableArray alloc] init];  
     self.searchResults = array; 
     [array release], array = nil; 
    } 

    [[self searchResults] removeAllObjects]; 
    if ([[self savedSearchTerm] length] != 0) 
    { 

     NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(Name contains[cd] %@)", searchTerm]; 
     self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy]; 

     } 


} 

プロパティは、すべてのdeallocメソッドでリリースされています

self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy]; 

ここに私のhandleSearchTerm方法です。

@property (nonatomic, copy) NSString *savedSearchTerm; 
@property (nonatomic, retain) NSMutableArray *datenSort; 
@property (nonatomic, retain) NSMutableArray *searchResults; 

、これは私がテーブルビュー内に置く方法です::そして彼らはcellForRowAtIndexPath:

if(tableView == self.searchDisplayController.searchResultsTableView){ 

     dataItem = [searchResults objectAtIndex:indexPath.row]; 

    }else { 

     dataItem = [datenSort objectAtIndex:indexPath.row]; 

    } 

あなたの答えは非常に高く評価されています!

答えて

1

このラインリーク:

self.searchResults = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy]; 

メモリ管理規則によると、あなたが作成したオブジェクトを所有し、あなたは、「新」、「コピー名「のalloc」で始まるメソッドを使用してオブジェクトを作成します"、または" mutableCopy "。保持されたオブジェクトを返すとsearchResultsプロパティセッターも過保持されているオブジェクトで、その結果、物体を保持mutableCopyしたがって

、。解決策はそれをrelease ...

NSArray *temp = [[datenSort filteredArrayUsingPredicate:predicate] mutableCopy]; 
self.searchResults = temp; 
[temp release]; 

...またはautoreleaseメッセージを送信することにより、オブジェクトの所有権を放棄することです。

self.searchResults = [[[datenSort filteredArrayUsingPredicate:predicate] mutableCopy] autorelease]; 
関連する問題