Почему мой одноэлементный класс не может вернуть значение, которое останется в области видимости - PullRequest
0 голосов
/ 09 ноября 2010

Оставайся со мной. У меня проблемы со зрением, я никогда раньше не пользовался этим сайтом и, вероятно, не буду публиковать его в том формате, к которому вы все привыкли. Я прошу прощения за любые непреднамеренные ложные обвинения здесь.

Использование Objective-C в проекте iOS…

У меня есть одноэлементный класс, настроенный, как кажется, обычным способом для Objective-C. В основном это серия методов, которые принимают значения NSString, интерпретируют их и возвращают что-то еще. В приведенном ниже коде я упрощаю вещи до минимума, чтобы подчеркнуть проблему, с которой я столкнулся.

Из класса одиночных игр:

- (NSUInteger) assignControlState:(NSString *)state {
    // excerpted for clarity...
    return UIControlStateNormal; // an example of what might be returned
}

Теперь экземпляр другого класса пытается использовать этот метод следующим образом:

- (void) buttonSetup:(UIButton*)button {
    [button setTitle:@"something" forState:[[SingletonClass accessToInstance] assignControlState:@"normal"]];
}

Этот код действительно работает. Однако, когда система переходит к рисованию интерфейса пользователя, который включает кнопку, заголовок которой был установлен таким образом, возникает ошибка EXC_BAD_ACCESS.

Если метод assignControlState перемещен в тот же класс, что и метод buttonSetup, ошибка не генерируется.

Полагаю, это что-то в управлении памятью от Apple, которое я не совсем понимаю, и как дела выходят и выходят за рамки, но ради жизни я не могу понять, куда иду неправильно.

Надеюсь, кто-то может помочь. Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 ноября 2010

Проблема в вашем методе accessToInstance.Могу поспорить, что вы недостаточно удерживаете.Реализация должна быть примерно такой:

static SingletonClass *sSingletonClass = nil;

@implementation

+ (id)accessToInstance {
  if (sSingletonClass == nil) {
    sSingletonClass = [[[self class] alloc] init];
  }
  return sSingletonClass;
}
@end

Теперь, если ваша программа следует нормальным правилам управления памятью, синглтон останется без изменений.Вы можете проверить, написав:

- (void)dealloc {
  [super dealloc];  // <-- set a breakpoint here.
}

Если отладчик останавливается на этой точке останова, вы знаете, что что-то в вашей программе перевыпустило синглтон.

0 голосов
/ 09 ноября 2010

Вы знаете этот бит, который вы взяли для ясности?Я думаю, что вы должны показать нам, что это такое, потому что где-то, возможно, есть переиздание.

В частности, я думаю, что вы выпускаете автоматически выпущенный объект.Если вы сделаете это и не будете использовать объект снова, все будет продолжаться нормально до тех пор, пока не будет истощен пул автоматического выпуска.Автозапуск пула автоматически удаляется в конце события примерно в то же время, когда обычно происходит рисование.

Это также объясняет задержку сбоя после NSLogs.

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