Почему я терплю крах?Dealloc / релиз + свойство / сохранить странность - PullRequest
1 голос
/ 13 августа 2011

Код в моем контроллере:

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 ]

2 голосов
/ 13 августа 2011

Если вы что-то делаете с blockArray после этой строки:

[calcBB release]; // Releases calcBB.

Тогда это и есть причина аварии.

Вы выпускаете calcBB, который в свою очередь выпускает blockArray в dealloc.

Я подозреваю, что вам нужно сохранить blockArray, обработать его как требуется, а затем отпустить.

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

// Process blockArray as needed

[blockArray release];
1 голос
/ 13 августа 2011

Это:

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

обычно означает, что blockArray сохраняется, но также автоматически высвобождается. Если вы хотите сохранить его живым, вам придется сохранить его самостоятельно, в противном случае он будет освобожден пулом автоматического выпуска через некоторое время.

0 голосов
/ 13 августа 2011

Опубликовать обратный след аварии. Скорее всего, это потому, что вы перевыпустили что-то в массиве (или в самом массиве где-то еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...