2011-03-12 9 views
0

상대적인 Objective-C 초보자로서 분명히 여전히 특정 메모리 관리 규칙을 파악하지 못했습니다.목표 C 재 할당/메모리 관리 충돌

- (void) playSound:(NSString*)soundType { 

    AVAudioPlayer *currentPlayer; 

    if ([soundType isEqualToString:@"4th"]) { 
     if (playerArray4thCounter >= [playerArray4th count]) playerArray4thCounter = 0; 
     NSLog(@"Playing from array: %@",playerArray4th); 
     currentPlayer = [playerArray4th objectAtIndex:playerArray4thCounter]; 
     playerArray4thCounter++; 
    } 
} 
: 다시 배열에 액세스하려고 할 때

NSArray *currentArray = playerArray4th; 
[currentArray release]; 
currentArray = nil; 
currentArray = [self getAudioPlayersForSoundFile:fileName ofType:ofType]; 

그리고 충돌 : 다른 기능에, 나중에 그런

@interface MyClass { NSArray *playerArray4th; } 

- (void) viewDidLoad { playerArray4th = [self getAudioPlayersForSoundFile:@"rimshot" ofType:@"aif"]; } 

- (NSArray*) getAudioPlayersForSoundFile:(NSString*)soundFileName ofType:(NSString*)soundFileType { 

    //code instantiating objects.... 

    NSArray *toRet = [[NSArray alloc] initWithObjects:toRetTickPlayer,toRetTickPlayerCopy,toRetTickPlayerCopy2,toRetTickPlayerCopy3, nil]; 
    return toRet; 
} 

:이되지 충돌을 만드는 방법을 알아낼 수 없습니다

답변

0

properties에 대해 배우고 getters 및 setters 사용에 대해 알아보십시오. 진행 상황을 정확히 알지 못하면 바로 가기를 사용하지 마십시오. 할당하고 얻기 위해, 항상 사용 self.playerArray4th

@synthesize playerArray4th; 

다음 :

@property (nonatomic,retain) NSArray *playerArray4th; 

을 다음 .m 파일에 게터/세터를 만들 :

그래서 헤더 파일에 playerArray4th 속성을 정의 변수. 이전 개체는 필요할 때 릴리스됩니다.

그래서이 누출되지 않습니다

self.playerArray4th = [NSArray arrayWithObjects:@"text",@"text",nil]; 
self.playerArray4th = [NSArray arrayWithObjects:@"new array",@"text",nil]; 

을 두 번째 과제는 첫 번째 배열을 방출하기 때문이다.

또한 autorelease에 대해 읽으십시오. 즉, alloc, copy 또는 new 인 경우 release 또는 autorelease 중 하나 여야합니다. 이것에 관해 여기에서 읽어야 할 것이 많습니다. 그래서 지금 여기서 반복하지 않을 것입니다.

dealloc 방법에 self.playerArray4th = nil;을 입력하는 것을 잊지 마십시오.

+0

물론 포인터로 주위를 돌릴 수는 있지만 메모리 관리 규칙에 대해 절대적으로 확신하지 못하는 경우에는 권장하지 않습니다. 코드/이해에서 실제로 잘못되는 것은 'currentArray = playerArray4th'라고 말하면 여전히 하나의 객체 만 존재한다는 것입니다. 두 포인터 중 하나에서'release'를 호출하면이 하나의 객체가 해제됩니다. 'currentArray'에 무언가를 지정해도'playerArray4th'는 어딘가에 무작위로 향하게되어 추후 충돌이 발생합니다. 따라서 속성을 사용하십시오. – mvds

+0

네, 저는 속성을 사용해야한다고 생각합니다. 저는 그것들이 없어도 여전히 그것을 이해하고 싶지만, 현재는 (그리고 저의 이해 수준), 그 것이 작동합니다. 그러나 나중에 배열의 요소에 액세스 할 때 변경되지 않은 것처럼 보입니다. 그래서 현재 배열을 설정하고 다음과 같습니다 :' " " ", " "'나중에 다시 액세스 할 수는 있지만 이전 값은 ' '입니다. ", " " –

+0

우선 포인터의 값은 실제로 무슨 일이 일어나고 있는지 알지 못하는 한, 어떤 가정을 기초로하기에는 일반적으로 적합하지 않습니다. 왜 처음 두 변수가 필요한지 모르겠지만 장소도 있지만 전체 코드를 공유하지 않는 것 같아서 말할 필요가 없습니다. – mvds