[сам выпуск], [сам dealloc] или [супер dealloc] в init методах?

function hasLowerCase(str) {
    return str.toUpperCase() != str;
}

или

function hasLowerCase(str) {
    for(x=0;x<str.length;x++)
        if(str.charAt(x) >= 'a' && str.charAt(x) <= 'z')
            return true;
    return false;
}
12
задан Kriem 25 May 2009 в 16:53
поделиться

4 ответа

Я считаю, что общепринятая практика - возвращать ноль в случае неудачи. Но вы действительно хотите освободить себя, чтобы избежать утечки:

-(id)init
{
  if (self = [super init]) {
    ...
    if (thingsWentWrong) {
      [self release];
      return nil;
    }
    ...
  }
  return self;
}
16
ответ дан 2 December 2019 в 04:53
поделиться

Правильные решения (исключения и / или [самовыпуск]; return nil; ) были рассмотрены, я обращусь к неправильным решениям.

Дон ' t отправить dealloc напрямую. Это работа выпуска . (И если ваш код когда-либо работает в GC, dealloc неприменим, и я мог только предполагать, какие проблемы вызовет его вызов.)

Дважды не используйте super ], чтобы отправить его напрямую. Это пропустит вашу собственную реализацию dealloc .

9
ответ дан 2 December 2019 в 04:53
поделиться

Философия Cocoa в отношении исключений заключается в том, что они должны выдаваться только в ситуациях, которые являются ошибками программиста , например, передача недопустимого аргумента методу. Если что-то еще пойдет не так, метод должен просто вернуть NO или nil и, надеюсь, сообщить подробности с помощью параметра «out» NSError **

Сюда входят методы -init. Если ситуация с ошибкой является чем-то, что может законно возникнуть в готовом продукте, тогда метод должен освободить self (чтобы избежать утечки) и вернуть nil.

Если что-то еще пойдет не так, метод должен просто вернуть NO или nil и, надеюсь, сообщить подробности с помощью параметра «out» NSError **

Сюда входят методы -init. Если ситуация с ошибкой является чем-то, что может законно возникнуть в готовом продукте, тогда метод должен освободить self (чтобы избежать утечки) и вернуть nil.

Если что-то еще пойдет не так, метод должен просто вернуть NO или nil и, надеюсь, сообщить подробности с помощью параметра «out» NSError **

Сюда входят методы -init. Если ситуация с ошибкой является чем-то, что может законно возникнуть в готовом продукте, тогда метод должен освободить self (чтобы избежать утечки) и вернуть nil.

6
ответ дан 2 December 2019 в 04:53
поделиться

Я всегда использовал метод очистки и возврата nil . Три метода, которые вы упомянули в заголовке вопроса, могут вызвать segfaults выше в иерархии вызовов, тогда как возврат nil - нет. Я считаю, что сами документы Apple говорят, что в случае неудачи они возвращают ноль. Где вы находите неточности?

0
ответ дан 2 December 2019 в 04:53
поделиться