2011-02-04 5 views
0

내 코드의이 섹션에는 여러 메모리 누수가 있습니다. 특히 이러한 배열은 PlaylistItem, PlaylistItemID 및 PlaylistItemLength입니다. 문제는 배열을 성공적으로 릴리스 할 수 없다는 것입니다. 삽입 [xxxx 릴리즈] 사용하려고 할 때; 이 코드 어디서나 앱이 잠 깁니다. 그것은 나에게 절대적으로 nurtz를 몰고있다!NSMutableArray 메모리 누수 문제

-(void)configureCueSet { 
MPMediaQuery *myPlaylistsQuery = [MPMediaQuery playlistsQuery]; 
NSArray *playlists = [myPlaylistsQuery collections]; 

//Get # of items in a playlist and names ------------------------------------- 
NSArray *songs; 
for (MPMediaPlaylist *playlist in playlists) { 
    NSString *playListItem = [playlist valueForProperty: MPMediaPlaylistPropertyName]; 
    if ([playListItem isEqualToString: savedLastSelectedPlaylist]){ 
     songs = [playlist items]; 
    } 
} 
PlaylistItem = [[NSMutableArray alloc] init]; 
PlaylistItemID = [[NSMutableArray alloc] init]; 
PlaylistItemLength = [[NSMutableArray alloc] init]; 
for (MPMediaItem *song in songs) { 
    [PlaylistItem addObject:[song valueForProperty: MPMediaItemPropertyTitle]]; 
    [PlaylistItemID addObject:[song valueForProperty: MPMediaItemPropertyPersistentID]]; 
    [PlaylistItemLength addObject:[song valueForProperty: MPMediaItemPropertyPlaybackDuration]]; 
} 
} 

답변

1

해당 메소드가 여러 번 호출 되었습니까? 그렇다면 해당 할당에서 누수가 발생할 가능성이 높습니다. 원하는 사항은 다음과 같습니다.

[PlayListItem release]; 
PlaylistItem = [[NSMutableArray alloc] init]; 

[PlayListItemID release]; 
PlaylistItemID = [[NSMutableArray alloc] init]; 

[PlaylistItemLength release]; 
PlaylistItemLength = [[NSMutableArray alloc] init]; 

이전에 출시 된 버전을 출시하지 않으면 누출이 발생합니다.

+0

감사합니다. Nick! 그 트릭을 했어! 이제는 그런 명백한 의미를 갖습니다. 이 메소드는 여러 번 호출됩니다. 때때로 나는 나무 숲을 볼 수 없다! – Marsman

+0

안녕하세요, 문제 없습니다. 다행히 도울 수있어. 조심해 곰. ;) –

1

[xxx 출시]를 삽입하면 배열이 아닌 내용이 해제됩니다. 배열에 추가하려고하는 객체의 할당을 해제하기 때문에 응용 프로그램이 충돌합니다. 설명서 (here)에 따르면 NSArray의 값은 자동으로 유지되며 배열이 dealloc 될 때 즉시 해제됩니다. 따라서 배열 중 하나를 해제하려면 [PlaylistItem release]을 입력하기 만하면됩니다.

+0

답장을 보내 주셔서 감사합니다. [PlayListItem release]를 추가하는 중입니다. "SIGABRT"를 생성합니다. 나는 당황 스럽다. – Marsman

+0

어디에서 추가하고 있습니까? 배열이 더 이상 필요 없다고 확신 할 때만 배열을 릴리스해야합니다. 코드 네피가가는 한 실제로 배열을 사용하지 않고 배열을 채 웁니다. 그 (것)들을 어딘가에 풀어 놓는 것은 말이되지 않습니다. –

+0

배열은 앱의 여러 위치에서 사용됩니다. 배열을 더 이상 사용하지 않을 때까지 누출을 막습니까? 누출로 인해 내 앱이 거부되지 않습니까? – Marsman