2010-06-10 37 views
1

這裏是我的自定義類:的OBJ-C:調用release/dealloc中導致EXC_BAD_ACCESS

PolygonShape : NSObject { 
int numberOfSides; 
int minimumNumberOfSides; 
int maximumNumberOfSides; 
} 

我的自定義init方法:

- (id)initWithNumberOfSides:(int)sides minimumNumberOfSides:(int)min maximumNumberOfSides:(int)max { 
if (self = [super init]) { 
    [self setMinimumNumberOfSides:min]; 
    [self setMaximumNumberOfSides:max]; 
    [self setNumberOfSides:sides]; 
} 

return self; 
} 

我的dealloc方法:

- (void) dealloc { 
NSLog("Calling dealloc"); 
[super dealloc]; 
} 

我示例代碼崩潰:

PolygonShape *shape1 = [[PolygonShape alloc] initWithNumberOfSides:6 minimumNumberOfSides:5 maximumNumberOfSides:9]; 
[shape1 release]; 

我已經分配了一個PolygonShape增加保留計數1,然後釋放ing應該遞減到0並調用dealloc,將該消息打印到NSLog,但我只是得到EXC_BAD_ACESS。我可以在創建對象後訪問和更改對象中的字段,以便一切工作都可以完成。非常感謝您的幫助!

+0

你有適當的autorelease池嗎? (我目前唯一的想法!) – ShinTakezou 2010-06-10 21:25:08

+0

不要忘記檢查dreamlax的發佈作爲正確的答案。 – 2010-06-10 21:26:23

回答

6
NSLog("Calling dealloc"); 

您正在傳遞一個常規C字符串,而不是NSString。你需要這樣做:

NSLog(@"Calling dealloc"); 

你的編譯器應該警告你傳遞一個不兼容的指針。

+0

這樣做! GOOD眼睛! – Mark 2010-06-10 21:25:22

+0

+1 expecially對於「你的編譯器應該警告......」......我們學習:永遠不要忽視警告! – ShinTakezou 2010-06-11 10:10:19

0

你有沒有添加這些到@interface ...

@property(assign) int numberOfSides, minimumNumberOfSides, maximumNumberOfSides; 

和這些進入@implementation

@synthesize numberOfSides, minimumNumberOfSides, maximumNumberOfSides; 

的制定者不會自動除非你明確@synthesize生成它。

+0

我在.h @property int numberOfSides; @property int minimumNumberOfSides; @property int maximumNumberOfSides; 而在.m中: @synthesize numberOfSides; @synthesize minimumNumberOfSides; @synthesize maximumNumberOfSides; 那些制定者/ getters工作得很好。我的問題是分配和釋放。我認爲沒有什麼特別的事情要做,因爲我的愛人都不是對象。 – Mark 2010-06-10 21:21:58

+0

不應該導致另一種問題(例如像未知的選擇器)?我也會考慮autorelease池... – ShinTakezou 2010-06-10 21:24:10

+0

@Mark:我看不到你的發佈代碼中有任何內存管理錯誤。 – kennytm 2010-06-10 21:24:38

0

它撞上了哪條線?錯誤是否可以在你在initWithNumberOfSides中調用的方法之一中?

如果做「構建和調試」,以找到它崩潰沒有幫助,我會打開NSZombieEnabled發現問題(不要忘了將它關閉!)