Выполнение работы в цели C init - PullRequest
4 голосов
/ 02 марта 2012

В C ++ выполнение тяжелой работы в конструкторе не рекомендуется, среди прочего, если исключение выдается после выделения памяти, может возникнуть утечка памяти. В Java это все еще не рекомендуется, но оно имеет меньшее значение из-за сборщика мусора. В задаче C, где позиция метода init в отношении тяжелой работы?

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

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

Допустимо, но редко, разрешать init сбои и возвращать nil. Для правильного подхода смотрите ответ bbum здесь: Возвращение nil в init в коде Objective C .

3 голосов
/ 02 марта 2012

В Objetive-C шаблон для инициализатора равен

-(id)init
{
    if (self = [super init]) {
       // Initialization code here
    }
    return self;
}

В случае сбоя инициализатора он должен вернуть nil. Это означает, что в случае сбоя инициализатора необходимо правильно выпустить self, чтобы избежать утечки. Поэтому я думаю, что вы в безопасности, пока вы следуете шаблону.

-(id)init
{
    if (self = [super init]) {
        if (myInitializationFunc() == ERR_FAIL) {
            [self release];
            return nil;
        }
    }
    return self;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...