2012-01-20 3 views
0

インスツルメンツは、このコードでメモリリークがあると言っている:ここで私はどこに記憶を漏らしていますか?使用される機器

- (void)layoutImageMaskViewForImageAtPath:(NSString *)path withFillColor:(UIColor *)color indexPath:(NSIndexPath *)indexPath { 
    UIImage *image = [UIImage imageWithContentsOfFile:path]; 
    [self layoutImageMaskViewForImage:image withFillColor:color indexPath:indexPath]; 
} 

UIColor *anIconFillColor = [UIColor colorWithWhite:0.70 alpha:1.0]; 
NSIndexPath *anIndexPath = [NSIndexPath indexPathForRow:0 inSection:0]; 
NSString *aPlaceholderPath = [[NSBundle mainBundle] pathForResource:@"path" ofType:@"png"]; 
[self layoutImageMaskViewForImage:anImage withFillColor:anIconFillColor indexPath:anIndexPath]; 

NSDictionary *anAssignedData = [aReservationData objectForKey:kAssignedSectionKey]; 
NSMutableArray *anEmployeeTaskQueueList = [NSMutableArray array]; 
NSArray *anAssignedReservationData = [anAssignedData objectForKey:kEmployeesIdentifier]; 

for (NSDictionary *aJobQueueData in anAssignedReservationData) { 
    EmployeeReservationQueue *anAssignedTaskQueue = [[EmployeeReservationQueue alloc] initWithServerDictionary:aJobQueueData]; 

    if (anAssignedTaskQueue.rows.count == 0) { 
     ReservationTrack *aTrack = [[ReservationTrack alloc] init]; 
     aTrack.rowSortOrder = 0; 
     aTrack.reservations = [NSArray array]; 
     anAssignedTaskQueue.rows = [NSArray arrayWithObject:aTrack]; 
     [aTrack release]; 
    } 

    [anEmployeeTaskQueueList addObject:anAssignedTaskQueue]; 
    [anAssignedTaskQueue release]; 
} 
+0

スタティックアナライザーをXcode(コマンド+シフト+ B)で実行してみてください。 –

+0

静的アナライザーで見つからない – Jon

+0

私はここに漏れはありませんが、器具がそう言っていれば、この特定のコードスニペットが犯人である必要はありません。それはコードのこの部分にちょうど関係している別の場所かもしれません – aqs

答えて

1

あなたの第二の例はtrackリークが発生します。最後の行が代わりにaTrackをリリースしています。 aTrackは何

[aTrack release]; 

:ここでは第2のケースで

+0

いいえ、私は' track'を公開しています、私はちょうどこの質問で間違って入力しました。 – Jon

1

?あなたは[track release];を意味するかもしれませんか?

おそらく、おそらく、非オートリリースされたパラメータを渡すか、そのメソッドを呼び出した後に解放していない可能性があります。そのメソッドを呼び出す場所にコードをポストしてチェックします。

+0

最初に渡されるパラメータは、init/alloc/releasedです。 'NSString'、' UIColor'、 'NSIndexPath'はalloc/initではないので解放されません。 – Jon

+0

いいえ、私は 'track'を公開しています、私はちょうどこの質問で間違って入力しました。 – Jon

+0

コードを投稿できますか? – Nekto

1

Objective-Cのゴールドメモリ管理ルール
'init'、 'copy'、 'mutableCopy'、 'retain'は、 'release'または 'autorelease'を呼び出す必要があります。

+0

いいえ、私は 'track'をリリースしています、私はちょうどこの質問で間違って入力しました。 – Jon

0

お客様のアプリがReservationTrackオブジェクトをリークしていると報告しています。デフォルトでは、リークされたオブジェクトがどこに割り当てられたかが表示されます。これは投稿したコードです。あなたが掲示したコードはReservationTrackを漏らさない。 NSMutableArrayに格納されているEmployeeReservationQueueに格納します。 1つの可能性は、後でReservationTrackオブジェクトにアクセスし、retainを送信し、releaseまたはautoreleaseを送信しないことです。もう1つの可能性は、EmployeeReservationQueueまたはNSMutableArrayが漏れることです。

シミュレータを使用すると、ほとんどのオブジェクトの完全な保持/解放履歴を見ることができます。漏れたオブジェクトが表示されたら、オブジェクトのアドレスにマウスを移動し、アドレスの横に表示される右矢印をクリックします。インストゥルメントには、そのオブジェクトのすべてのmallocretainrelease、およびautoreleaseイベントが表示されます。メニューバーから[表示]> [拡張詳細]を選択すると、それらのイベントのいずれかをクリックしてイベントのスタックトレースを表示できます。これは、アンバランスなretainを追跡するのに役立ちます。

関連する問題