2010-12-23 114 views
0

嚴重問題在這裏...我收到ECX_BAD_ACCESS如果我嘗試NSLog我的自定義對象的實例變量。以下功能在我的ViewController中調用,​​保存從一個url拉取的字符串數據。實例變量不可訪問

- (void) initVcardWithData:(NSString *)payload { 
    NSLog(@"1. initVcardWithData"); 
    aVCard = [[vcardItem alloc] initWithPayload:payload]; 
    VCardViewController *aVCardViewController = [[VCardViewController alloc] initWithVCard:aVCard]; 
    [self presentModalViewController:aVCardViewController animated:YES]; 
    [aVCard release]; 
} 

到目前爲止好。該initWithWithVCard功能如下,theVCardtheVCardN在@implementation定義且還設置爲@property(非原子,保留)在(.H)。:

-(id)initWithVCard:(vcardItem *)aVCard { 
    if(self = [super init]) { 
     theVCard = [aVCard retain]; 
     theVCardN = [theVCard.PersonName retain]; 
    } 

    NSLog(@"---- vCardViewController :: initWithVcard :: FirstName: %@", theVCard.PersonName.FirstName); 
    return self; 
} 

如果我在的ViewController訪問theVCardN對象aVCardViewController以內ViewDidLoad一切都像一個魅力。我用來自該對象的數據設置了一些標籤。

如果我然後嘗試訪問theVCardN中的實例變量,該函數從連接到View中按鈕的IBAction中調用,我在調試器控制檯上收到EXC_BAD_ACCESS錯誤。它試圖從實例變量拉數據的功能如下:

-(IBAction)addressbookButtonTapped { 
NSLog(@"RETAIN COUNT FOR theVCard: %i", [theVCard retainCount]); 
NSLog(@"RETAIN COUNT FOR theVCardN: %i", [theVCardN retainCount]); 
NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 



//[self dismissModalViewControllerAnimated:YES]; 
} 

的RetainCounter爲theVCardN右調用的NSLog輸出「1」之前。 NSLog Line然後在Debugger Console中返回EXC_BAD_ACCESS。

有什麼想法?

+0

我的猜測是vCard設置不正確。在NSLog執行之前 – Eiko 2010-12-23 12:22:19

+0

在gdb中打印值。你會知道什麼是實際問題。在調試模式下,將光標放在該行上。左鍵單擊出現的黃色標籤並單擊打印說明。你可以看到什麼是價值。 – Raxit 2010-12-23 12:33:23

+0

輸出結果是:`打印VCardN.FirstName的描述:`沒有更多 – MadMaxAPP 2010-12-23 14:11:49

回答

1

不要調用-retainCount。絕對保留計數是無用的。

retainCount返回一個對象的絕對保留計數。實際值將是一個實現細節,通常完全超出了你的控制範圍,因爲系統框架可能會在內部執行任意數量的操作,導致保留計數以不期望的方式進行修改。

這對調試毫無用處,它們是專門關注這些問題的豐富工具。

首先,如果發生碰撞,有回溯。發表它。可能不是在這種情況下很有趣,但是,仍然總是期待回溯到至少確認它正在崩潰在哪裏/你是怎麼想的。

從發佈的證據,它聽起來像theVCardN.FirstName被設置爲垃圾或底層的字符串已被過度釋放。打開殭屍檢測模式,看看是否是這種情況。由於它在FirstName上崩潰,因此顯示與創建/存儲FirstName相關的代碼。

此外,實例變量和方法應始終以小寫字母開頭; PersonName應該是personName & FirstName應該是firstName

0

也許我讀的代碼錯誤或誤解你的類結構,但它看起來像你登錄:

NSLog(@"Save to Adressbook: %@", theVCardN.FirstName); 

以上,你說,這是仍在工作,你正在登錄:

theVCard.PersonName.FirstName 

你是否缺少「PersonName」?意思是你應該記錄:

NSLog(@"Save to Adressbook: %@", theVCardN.PersonName.FirstName);