0
作爲一個相對的Objective-C初學者,我顯然還沒有掌握某些內存管理規則。我無法弄清楚如何使這種不崩潰:Objective C重新分配/內存管理崩潰
@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;
}
再後來,在一個不同的功能:
NSArray *currentArray = playerArray4th;
[currentArray release];
currentArray = nil;
currentArray = [self getAudioPlayersForSoundFile:fileName ofType:ofType];
而且它崩潰試圖再次訪問數組的時候:
- (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++;
}
}
當然,你可以用指針來擺弄,但如果你對內存管理規則不是很有信心,我不會推薦它。你的代碼/理解實際上出了什麼問題,如果你說'currentArray = playerArray4th',那麼仍然只有一個對象。在任一指針上調用'release'會釋放這個對象。給'currentArray'分配一些東西仍然會使'playerArray4th'指向某個隨機的地方,導致之後的崩潰。所以,使用屬性。 – mvds 2011-03-12 01:36:37
是的,我想我應該使用屬性 - 我仍然希望沒有它們,但現在(和我的理解水平),這是有效的。但是,當我稍後訪問數組中的元素時,它們似乎沒有改變。所以我設置當前數組,它等於:「」 「」, 「」'然後再次訪問它,但我仍然得到以前的值' 「 「, 」「' –
2011-03-12 01:39:38
首先:指針值通常不適用於基於任何假設,除非您真的知道發生了什麼,我不明白爲什麼您需要這兩個變量地方,但它似乎也沒有分享完整的代碼,所以很難說清楚。 – mvds 2011-03-12 01:44:35