상대적인 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;
}
:이되지 충돌을 만드는 방법을 알아낼 수 없습니다
물론 포인터로 주위를 돌릴 수는 있지만 메모리 관리 규칙에 대해 절대적으로 확신하지 못하는 경우에는 권장하지 않습니다. 코드/이해에서 실제로 잘못되는 것은 'currentArray = playerArray4th'라고 말하면 여전히 하나의 객체 만 존재한다는 것입니다. 두 포인터 중 하나에서'release'를 호출하면이 하나의 객체가 해제됩니다. 'currentArray'에 무언가를 지정해도'playerArray4th'는 어딘가에 무작위로 향하게되어 추후 충돌이 발생합니다. 따라서 속성을 사용하십시오. – mvds
네, 저는 속성을 사용해야한다고 생각합니다. 저는 그것들이 없어도 여전히 그것을 이해하고 싶지만, 현재는 (그리고 저의 이해 수준), 그 것이 작동합니다. 그러나 나중에 배열의 요소에 액세스 할 때 변경되지 않은 것처럼 보입니다. 그래서 현재 배열을 설정하고 다음과 같습니다 :' " " ", " "'나중에 다시 액세스 할 수는 있지만 이전 값은 ' '입니다. ", " " –
우선 포인터의 값은 실제로 무슨 일이 일어나고 있는지 알지 못하는 한, 어떤 가정을 기초로하기에는 일반적으로 적합하지 않습니다. 왜 처음 두 변수가 필요한지 모르겠지만 장소도 있지만 전체 코드를 공유하지 않는 것 같아서 말할 필요가 없습니다. – mvds