Проблема управления памятью в GTMTest - PullRequest
0 голосов
/ 13 декабря 2010

Здравствуйте, у меня проблема со следующим кодом в GTMTestCase:

- (void)testSomething {
myType *year = [myType valueFromString:@"1978"];
STAssertTrue([year isKindOfClass:[XBNumberAttribute class]], @"Must be subtype.");
}

Если я построю это (= выполню тесты), я получу «ошибку сегментации» $ TARGET_BUILD_DIR / $ EXECUTABLE_PATH "-RegisterForSystemEvents, команда / bin / sh завершилась ошибкой с кодом завершения 139 ".Это, однако, исчезает, как только я сохраняю объект year (который на самом деле автоматически высвобождается в методе valueFromString, см. Ниже):

- (void)testSomething {
myType *year = [[myType valueFromString:@"1978"] retain];
    //STAssertTrue(([year retainCount] == 2), @"Retain count wrong");
STAssertTrue([year isKindOfClass:[XBNumberAttribute class]], @"Must be subtype.");
}

Раскомментирование утверждения retainCount действительно показывает, что в этом месте счет сохранения равен 2,Однако, если я поставлю [год выпуска] в конце метода, сборка снова завершится с ошибкой, как описано выше.

В чем здесь дело?

РадиВ полноту я включаю код valueFromString:

+ (id)valueFromString:(NSString *)pString { 
return [[[myType alloc] initWithString:pString] autorelease];
}

А вот метод initWithString:

- (id)initWithString:(NSString *)pString  {
if (self = [super initWithString:pString]){ 
}
return self;
}

, указывающий на следующий метод супертипа:

- (id)initWithString:(NSString *)pString 
{
if (self = [super init]) {
theNumber = [NSNumber numberWithInt:[pString intValue]];
}
 return self;
}

1 Ответ

0 голосов
/ 14 декабря 2010

После включения всех параметров отладки автоматического выпуска (см. http://www.cocoabuilder.com/archive/cocoa/87251-how-do-debug-an-autorelease-crash.html), Я нашел решение:

Переменная theNumber не доступна через средство доступа к свойству, поэтому она фактически не сохраняется (вinitWithString метода супертипа, последнего фрагмента кода. Поскольку он, однако, получает релиз в методе dealloc этого типа, поскольку он помечен как @property (retain) (информация здесь не включена, но важна!), я получил ошибкукогда был вызван autorelease дочернего объекта (первый фрагмент кода): он выпустил супертип и вместе с ним атрибут, которого больше не было.

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