0

我花了幾個小時,並閱讀有關內存管理,僵屍網絡上的每一點。泄漏(嘗試過的樂器)。但我無法弄清楚這一點。有人有線索嗎?我在彈出ChildViewController的代碼中獲取EXC_BAD_ACCESS。又一個EXC_BAD_ACCESS - 然而,與殭屍(儀器),從來沒有exe_bad_access

[profileVO release]; profileVO = nil; 

我強烈地感覺到我遵循了所有的內存管理最佳實踐!

詳情:

我有一個模型文件。 (CachedProfileVO)

CachedProfileVO.h

@interface CachedProfileVO : NSObject { 

    NSString *name; 
    NSString *email; 
} 

@property (nonatomic, retain) NSString *name; 
@property (nonatomic, retain) NSString *email; 

@end 

CachedProfileVO.m

@synthesize name, email; 
- (void) dealloc 
{ 
    [super dealloc]; 
    [name release]; name= nil; 
    [email release]; email = nil; 
} 

現在我有一個UINavigationController。 ParentViewController和ChildViewController。 我調用ChildViewController如下:

[self.navigationCntroller pushViewcontroller:childViewcontroller animated:YES]; 

在ChildViewController,我基本上使用模型CachedProfileVO。然而,當這個視圖控制器被彈出(UI上的後退按鈕),它給出了一個EXC_BAD_ACCESS

ChildViewController.h

@interface ChildViewcontroller : UITableViewController { 
    CachedProfileVO *profileVO; 

} 

@property (nonatomic, retain) CachedProfileVO *profileVO; 
@end 

ChildViewController.m

@synthesize profileVO; 

- (void) dealloc 
{ 
    [super dealloc]; 
    [profileVO release]; profileVO = nil; ****** GETTING EXE_BAD_ACCESS here 
} 

- (void) viewDidLoad 
{ 
CachedProfileVO *vo = [CachedProfileVO alloc] init]; 
self.profileVO = vo; 
[vo release]; 

} 

//responseString looks like this: [Murdoch, [email protected]][other data][more data] 
- (void) populateProfile:(NSString *) responseString 
{ 
    NSMutableString *str = [[NSMutableString alloc] initWithCapacity:20]; 
    [str setString:responseString]; 
    [str deleteCharactersInRange: NSMakeRange(0,1)]; 
    [str deleteCharactersInRange: NSMakeRange([str length]-1,1)]; 
    NSArray *tempArray = [str componentsSeparatedByString: @"]["]; 

    NSString *tempStr = (NSString*)[tempArray objectAtIndex:0]; 
    NSArray *bioArray = [tempStr componentsSeparatedByString:@","]; 

    self.profileVO.name = (NSString*)[bioArray objectAtIndex:0]; 
    self.profileVO.email= (NSString*)[bioArray objectAtIndex:1]; 

    [str release]; str = nil; 
} 

注意,功能populateProfile在某個事件後被調用。我知道它被稱爲。然後dealloc導致問題。這也不會發生在每個流行音樂中。我必須嘗試多次重現。它永遠不會被複制使用殭屍儀器!

回答

1

您在示例中首先打電話[super dealloc];。這應該總是最後一次調用,否則你正在訪問屬於現在釋放的類的實例變量。如果你遵循其他地方的內存管理規則,以下應該可以正常工

- (void) dealloc 
{ 
    [profileVO release]; 

    [super dealloc]; 
} 
+0

哇!作爲第一個說法,我已經看到了很多與[super dealloc]相關的例子。即使在蘋果的例子。直到今天,我已經做到了。從來沒有任何問題。不知道爲什麼這個例子開始發生。但移動[super dealloc]結束解決了這個問題。還有誰在意解釋爲什麼與NSZombie它從不崩潰? – mbh

+0

我已經學會了不依靠蘋果公司的例子來學習最佳實踐。我看到過使用過可怕的做法,甚至有些有警告的做法。殭屍可能沒有崩潰的原因是因爲它允許實例變量保持足夠長的時間來釋放它們。 – Joe

+0

謝謝喬。這個nszombie的東西有點混亂。雖然它是一個很棒的工具,但是當涉及到內存時,不應該過分信任工具。誰知道它在幕後做了什麼奇怪的事情,比如不釋放對象。我相信他們必須做到這一點。但是,這有點違背了目的。 – mbh