【问题标题】:Obj-C: calling release/dealloc causes EXC_BAD_ACCESSObj-C:调用 release/dealloc 导致 EXC_BAD_ACCESS
【发布时间】:2011-03-02 09:44:39
【问题描述】:

这是我的自定义类:

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。创建对象后,我可以访问和更改对象中的字段,因此直到那里的所有内容都可以正常工作。非常感谢您的帮助!

【问题讨论】:

  • 你有合适的自动释放池吗? (我目前唯一的想法!)
  • 别忘了查看dreamlax 的帖子是否为正确答案。

标签: objective-c memory-management


【解决方案1】:
NSLog("Calling dealloc");

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

NSLog(@"Calling dealloc");

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

【讨论】:

  • +1 尤其是“你的编译器应该警告...”...我们知道:永远不要忽略警告!
【解决方案2】:

它在哪一行崩溃?错误可能出在您在 initWithNumberOfSides 中调用的方法之一中吗?

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

【讨论】:

    【解决方案3】:

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

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

    并将这些放入@implementation

    @synthesize numberOfSides, minimumNumberOfSides, maximumNumberOfSides;
    

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

    【讨论】:

    • 我在 .h @property int numberOfSides; @property int minimumNumberOfSides; @property int maximumNumberOfSides;在 .m 中:@synthesize numberOfSides; @synthesize minimumNumberOfSides; @synthesize maximumNumberOfSides;那些 setter/getter 工作得很好。我的问题是分配和释放。我认为没有什么特别需要做的,因为我的 ivars 都不是对象。
    • 这不应该导致另一种问题(例如未知选择器)吗?我也会考虑自动释放池......
    • @Mark:我在您发布的代码中看不到任何内存管理错误。
    • @Shin:未知选择器也是 EXC_BAD_ACCESS。这就是@Mark 应该发布控制台消息的原因。 EXC_BAD_ACCESS 代码没用。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 2020-04-13
    • 1970-01-01
    • 2010-10-08
    相关资源
    最近更新 更多