开发者

Why do I crash? Dealloc/release + property/retain weirdness

开发者 https://www.devze.com 2023-03-28 00:41 出处:网络
Code in my controller: CalcBorderBlocks *calcBB = [[CalcBorderBlocks alloc] init]; NSMutableArray *blockArray = [calcBB calc:341241133];

Code in my controller:

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

Code in CalcBorderBlocks.h:

#import <Foundation/Foundation.h>

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

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

@end

Code in CalcBorderBlocks.m:

#import "CalcBorderBlocks.h"

@implementation CalcBorderBlocks
@开发者_JAVA技巧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


If you're doing anything with blockArray after this line:

[calcBB release]; // Releases calcBB.

Then that's the cause of the crash.

You're releasing calcBB which in turn releases blockArray in dealloc.

I suspect you need to retain blockArray, process it as required then release it afterwards.

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

// Process blockArray as needed

[blockArray release];


This:

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

usually means that blockArray is retained but also autoreleased. If you want to keep it alive, you'll have to retain it yourself, otherwise it will be released by the autorelease pool after a while.


Post the backtrace of the crash. More likely than not, it is because you overreleased something in the array (or the array itself somewhere else.

0

精彩评论

暂无评论...
验证码 换一张
取 消