Я нашел сбой в приложении iPhone с целевой iOS 4, который изменяется в зависимости от типа сборки.Использование ivar в блоке, возвращенном другому объекту
отладчик не дает мне ничего особенного, чтобы идти дальше, он останавливается на
UIViewController *result = [self factory](self);
с EXC_BAD_ACCESS. self
- класс, наследующий от NSObject (показан ниже как NSObjectInheritor). Зомби включены. Я попытался изменить метод factory
тремя способами со следующими результатами.
Это происходит сбой в обоих отладки и специальной сборки ...
- (FactoryMethod) factory;
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[ViewControllerClass alloc] initWithStuff:(boolValue ? foo : bar)];
} autorelease];
}
Это работает в отладочной версии, но сбои в специальной ...
- (FactoryMethod) factory;
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
if(boolValue)
{
return [[ViewControllerClass alloc] initWithStuff:foo];
}
else
{
return [[ViewControllerClass alloc] initWithStuff:bar];
}
} autorelease];
}
Это работает в обоих отладки и объявления специальная но очень некрасиво и излишним:
- (FactoryMethod) factory;
{
if(boolValue)
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[ViewControllerClass alloc] initWithStuff:foo];
} autorelease];
}
else
{
return [^ UIViewController * (NSObjectInheritor *newThing)
{
return [[[ViewControllerClass alloc] initWithStuff:bar];
} autorelease];
}
}
Моя теория, что boolValue
становится INAC в момент выполнения возвращенного блока. Это
@interface SubclassOfNSObjectInheritor : NSObjectInheritor
{
BOOL boolValue;
}
@property (readonly) BOOL boolValue;
(YES
или NO
назначены в инициализации SubclassOfNSObjectInheritor в конечно) и
@synthesize boolValue;
в реализации SubclassOfNSObjectInheritor в.
Окончательные вопросы - это моя теория о том, что неправильно правильно? Это третий способ сделать это - отметил, что он работает в специальных и отладочных сборках - безопасен? Каков наилучший способ сделать это?
Хороший ответ. Обратите также внимание на то, что «Build and Analyze» должен был поймать эту конкретную ошибку. Если это не так, напишите ошибку. – bbum
Спасибо - анализатор не жалуется, так что залогиньте ошибку. Проблема с копированием. –