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