Obj-C:调用release / dealloc导致EXC_BAD_ACCESS

时间:2010-06-10 21:12:55

标签: objective-c memory-management

这是我的自定义类:

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

我的自定义初始化方法:

- (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,然后释放应该将其减少为0并调用dealloc,将该消息打印到NSLog但我得到EXC_BAD_ACESS。我可以在创建后访问和更改对象中的字段,直到有效为止。非常感谢您的帮助!

3 个答案:

答案 0 :(得分:6)

NSLog("Calling dealloc");

您传递的是常规C字符串,而不是NSString。你需要这样做:

NSLog(@"Calling dealloc");

您的编译器应该警告您传递不兼容的指针。

答案 1 :(得分:0)

您是否已将这些内容添加到@interface ...

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

和这些进入@implementation

@synthesize numberOfSides, minimumNumberOfSides, maximumNumberOfSides;

除非您明确@synthesize,否则不会自动生成设置器。

答案 2 :(得分:0)

它崩溃了什么线?错误可能出现在您在initWithNumberOfSides中调用的方法之一吗?

如果进行“构建和调试”以找到崩溃的位置没有帮助,我会打开NSZombieEnabled来查找问题(不要忘记再次关闭它!)