2011-12-15 21 views
4

私の最後の学校プロジェクトの1つとして、iPad/iPhoneアプリケーションを作成しています。今日私はある種のメモリリークの問題に取り組んできました。私のアプリケーションは、特定のビューコントローラ(VCMainStatistics_iPad)から開始します。そこから別のビューコントローラ(VCSocialMedia_iPad)を押します。その後、最初のview-controllerに戻ります。Xcode 4.2.1:ARIPを使用したUIPickerViewによるメモリリークの発生

このシーケンスを繰り返すと、アプリのメモリ使用量が増加し続けていることがわかります(Instruments - Activity Monitorを使用して)。コードの一部を無効にすることで、私は最終的にそれがpickerViewと何か関係があることを発見しました。このコードは、全く漏れを与えない:I行の数を増やす場合

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return 0; 
} 

しかし、漏れは(行あたりおおよそ0.07メガバイト)の出現開始します。明らかに、これが私がpickerViewが漏れの原因だと思う理由です。私は、割り当て解除の前にpickerViewからサブビューを削除しようとしていましたが、pickerViewをnilに設定していましたが、何も問題は解決しません。うまくいけば、もう少し明確にするために、コードをいくつか追加します。

ヘッダファイル:

#import "UniversalViewController.h" 

#define DATATYPE_SOCIALMEDIA 0 

@interface VCSocialMedia_iPad : UniversalViewController <UIPickerViewDataSource, UIPickerViewDelegate> 
{ 
    NSArray *lMediaTypes; 
    NSMutableArray *lMediaData; 

    __weak IBOutlet UIPickerView *pkSocialMedia; 
    __weak IBOutlet UILabel *lblGraph; 
} 

@end 

PickerViewデリゲート方法:

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component 
{ 
    // Get key of requested row 
    NSString *title = [[lMediaTypes objectAtIndex:row] capitalizedString]; 

    // Capitalize first letter 
    title = [title capitalizedString]; 

    // Return 
    return title; 
} 



- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component 
{ 
    // Make or clear data lists 
    if(lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] == nil){ 
     lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] = [[NSMutableArray alloc] init]; 
    } 
    else{ 
     [lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] removeAllObjects]; 
    } 

    if(lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] == nil){ 
     lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] = [[NSMutableArray alloc] init]; 
    } 
    else{ 
     [lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] removeAllObjects]; 
    } 

    // Get required key 
    NSString *dictKey = [lMediaTypes objectAtIndex:row]; 

    if([dictKey isEqualToString:@"total_views"]){ 
     return; 
    } 

    // Adjust graph label 
    lblGraph.text = [NSString stringWithFormat:@"Stats from %@", dictKey]; 

    // Get data of selected row 
    NSArray *mediaData = [lMediaData objectAtIndex:row]; 

    // Add each day to data lists: inversed order 
    for(int day = [mediaData count]-1; day >= 0; day--){ 
     NSDictionary *dayData = [mediaData objectAtIndex:day]; 
     dictKey = @"wpsd_trends_date"; 

     NSString *date = [dayData objectForKey:dictKey]; 
     // Remove 00:00:00 
     date = [date stringByReplacingOccurrencesOfString:@" 00:00:00" withString:@""]; 
     [lGraphDayDataX[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] addObject:date]; 

     dictKey = @"wpsd_trends_stats"; 
     NSString *stats = [dayData objectForKey:dictKey]; 
     [lGraphDayDataY[iSelectedServerIndex][DATATYPE_SOCIALMEDIA] addObject:stats]; 
    } 

    // Update the graphs 
    [self updateGlobalScreen]; 
} 

PickerViewデータソース方法:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView 
{ 
    return 1; 
} 



- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component 
{ 
    return [lMediaTypes count]; 
} 

割り当て解除:

- (void)dealloc 
{ 
    pkSocialMedia = nil; 
    lblGraph = nil; 

    lMediaData = nil; 
    lMediaTypes = nil; 
} 

私は最近、プロジェクトをObjective-C ARCに変換したに過ぎません。この問題は、私のコンセプトに対する私の経験不足と関係している可能性があります。それを除けば、これは今までの私の最初のXcodeプロジェクトです。うまくいけば、ここの誰かが助けてくれるはずです。物事を明確にするためにコードを投稿する必要があるかどうか教えてください。

ありがとうございます!

答えて

0

ソリューション自体は見つかりませんでしたので、回避策を使用しました.NSPickViewをNSTableViewコンポーネントに置き換えることで、リークはもう発生しませんでした。問題に気づき、解決策を見つけようとした皆さん、試していただきありがとうございます!

0

-(void)deallocメソッドを削除してみます。 ARCを使用しているときは実装しないでください。 ARCを使用していない場合は、[super dealloc]に電話する必要があります。

+0

プロジェクトは既に終了しています。代わりに、NSTableViewコンポーネントを使用してリークを修正しました。私はもうファイルにアクセスすることができないので、あなたの解決策をもう試す方法はありません。それでも、おかげさまで、ありがとう! – Tybs

0

私も同様の問題があります。 UIPickerViewが境界外にある場合にのみ発生します。私がそれを修正したのは、UIPickerViewを境界から外してしまうことではありません(単純にフェードインして、UIPickerViewの表示/非表示を消してしまいます)。おそらくUIKitのバグです。

関連する問題