私の最後の学校プロジェクトの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プロジェクトです。うまくいけば、ここの誰かが助けてくれるはずです。物事を明確にするためにコードを投稿する必要があるかどうか教えてください。
ありがとうございます!
プロジェクトは既に終了しています。代わりに、NSTableViewコンポーネントを使用してリークを修正しました。私はもうファイルにアクセスすることができないので、あなたの解決策をもう試す方法はありません。それでも、おかげさまで、ありがとう! – Tybs