2009-11-22 109 views
1

我有一個地址接口這樣的:獲取「EXC_BAD_ACCESS」

@interface AddressCard : NSObject 
{ 
    NSString *name; 
    NSString *email; 
} 

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

-(void) print; 
-(void) setName:(NSString *) theName andEmail:(NSString *) theEmail; 
-(void) dealloc; 
@end 

和實施,:

#import "AddressCard.h" 

@implementation AddressCard 

@synthesize name, email; 

-(void) setName:(NSString *) theName andEmail: (NSString *) theEmail 
{ 
    self.name = theName; 
    self.email = theEmail; 
} 
-(void) print 
{ 
    NSLog (@"=============================="); 
    NSLog(@"| %-21s |", [self.name UTF8String]); 
    NSLog(@"| %-21s |", [self.email UTF8String]); 
    NSLog (@"=============================="); 
} 

-(void) dealloc 
{ 
    [name release]; 
    [email release]; 
    [super dealloc]; 
} 

@end 

當我運行它,我把池放出時得到一個EXEC_BAD_ACCESS。我無法找到原因,並感謝任何幫助。這是我進入Objective-C的第一步,請耐心等待。

感謝 蘇尼特

+2

我沒有看到任何會在您發佈的代碼中導致該錯誤的內容。我發現使用UTF8String而不是僅僅打印字符串本身是可疑的,但是這與任何正在耗盡的池不應該有任何關係。更可能的錯誤是在這個類被使用的地方。 – Chuck 2009-11-22 06:04:41

回答

2

由於發生錯誤排水池時,我可能會懷疑你已經釋放由該點的對象,對象是過度釋放(雖然通常你會得到一個「malloc double free」錯誤)或者內存已被其他東西覆蓋。我建議在啓用殭屍的情況下運行它,如this answer - 如果您有Snow Leopard,則可以使用Xcode的運行菜單中的樂器中的殭屍工具。祝你好運!

1

這個例子看起來很熟悉 - 我只是自己通過這本書!你上面發佈的代碼很好,所以問題必須在其他地方。您可以嘗試檢出the author's forum - 該章的每個步驟的源代碼都發布在那裏。

正如其他人所建議的,您可能需要尋找額外的'釋放'電話。

-1

既然你釋放你的dealloc方法中的字符串這樣看來,你的AddressCard對象假定字符串的所有權,但你用這條線來定義的性質在:

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

使用拷貝意味着你的目標是不保留字符串。嘗試更改該行:

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

使用保留意味着您的對象將保留字符串,直到您釋放它們在dealloc中。

希望能解決問題。

+0

不正確。 'copy'屬性意味着它調用'-copy'消息並假定副本的所有權。你正在考慮'assign',它被用於基元和代表等。 – 2009-11-22 16:46:51

+0

是的,我的錯誤,我正在考慮分配。道歉。 – 2009-11-24 02:43:48