2011-03-12 69 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