为什么我会崩溃? Dealloc / release + property / retain weirdness

时间:2011-08-12 22:44:22

标签: objective-c

我的控制器中的代码:

CalcBorderBlocks *calcBB = [[CalcBorderBlocks alloc] init];
NSMutableArray *blockArray = [calcBB calc:341241133];
[calcBB release]; // Releases calcBB.

CalcBorderBlocks.h中的代码:

#import <Foundation/Foundation.h>

@interface CalcBorderBlocks : NSObject {
 @private
  NSMutableArray *blockArray_;
}
@property(nonatomic, retain) NSMutableArray *blockArray;

- (NSMutableArray *)calc:(int)blockID;

@end

CalcBorderBlocks.m中的代码:

#import "CalcBorderBlocks.h"

@implementation CalcBorderBlocks
@synthesize blockArray = blockArray_;

- (id)init {
  self = [super init];
  if (self) {
    blockArray_ = [[NSMutableArray alloc] init]; // Retain count should be 1
  }
  return self;
}

- (NSMutableArray *)calc:(int)blockID {
// Do stuff
return self.blockArray;
}

- (void)dealloc {
  [blockArray_ release]; // Normal cleanup, yet crashes! Works fine if I comment out this line.
  [super dealloc];
}

@end

3 个答案:

答案 0 :(得分:2)

如果您在此行之后使用blockArray执行任何操作:

[calcBB release]; // Releases calcBB.

然后就是崩溃的原因。

您发布的calcBB会在dealloc中释放blockArray

我怀疑你需要保留blockArray,根据需要处理它然后在之后释放它。

CalcBorderBlocks *calcBB = [[CalcBorderBlocks alloc] init];
NSMutableArray *blockArray = [[calcBB calc:341241133] retain];
[calcBB release]; // Releases calcBB.

// Process blockArray as needed

[blockArray release];

答案 1 :(得分:1)

此:

  CalcBorderBlocks *calcBB = [[CalcBorderBlocks alloc] init];
  NSMutableArray *blockArray = [calcBB calc:341241133];
  [calcBB release]; // Releases calcBB.

通常意味着保留了blockArray,但也是自动释放的。如果你想让它保持活着,你必须自己保留它,否则它会在一段时间后由自动释放池释放。

答案 2 :(得分:0)

发布崩溃的回溯。更有可能的是,这是因为你过度释放了数组中的某些东西(或者数组本身在其他地方。

相关问题