2011-03-12 47 views
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++; 
    } 
} 

回答

0

尝试了解properties并了解如何使用getter和setter。除非你确切地知道发生了什么,否则不要采取捷径。

所以在你的头文件中定义的playerArray4th属性:

@property (nonatomic,retain) NSArray *playerArray4th; 

,然后在.m文件中创建的getter/setter:

@synthesize playerArray4th; 

然后,总是使用self.playerArray4th分配和获取变量。先前的对象将在需要时发布。

所以这不会泄漏:

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

,因为第二次分配释放第一阵列。

此外,请阅读有关使用autorelease。总之,如果你alloc,copynew,你应该releaseautorelease。这里有很多关于这方面的内容,我现在不再重复。

不要忘记把self.playerArray4th = nil;放在你的dealloc方法中。

+0

当然,你可以用指针来摆弄,但如果你对内存管理规则不是很有信心,我不会推荐它。你的代码/理解实际上出了什么问题,如果你说'currentArray = playerArray4th',那么仍然只有一个对象。在任一指针上调用'release'会释放这个对象。给'currentArray'分配一些东西仍然会使'playerArray4th'指向某个随机的地方,导致之后的崩溃。所以,使用属性。 – mvds 2011-03-12 01:36:37

+0

是的,我想我应该使用属性 - 我仍然希望没有它们,但现在(和我的理解水平),这是有效的。但是,当我稍后访问数组中的元素时,它们似乎没有改变。所以我设置当前数组,它等于:“” “”, “”'然后再次访问它,但我仍然得到以前的值' “ “, ”“' – 2011-03-12 01:39:38

+0

首先:指针值通常不适用于基于任何假设,除非您真的知道发生了什么,我不明白为什么您需要这两个变量地方,但它似乎也没有分享完整的代码,所以很难说清楚。 – mvds 2011-03-12 01:44:35