2015-06-05 3 views
0

Типичный init метод в Objective C возвращает nil, если инициализация не удается:Могу ли я использовать assert() для обнаружения сбоя [super init]?

- (id) init { 
    self = [super init]; 
    if (self) { 
    // more initialisation 
    } 
    return self; 
} 

ли смысл использовать утверждение, чтобы поймать инициализацые, которые должны всегда удаются? то есть:

- (id) init { 
    self = [super init]; 
    assert(self); // unrecoverable? 

    // more initialisation 
    array = [[NSArray alloc] init]; 
    assert(array); // unrecoverable? 

    return self; 
} 

В этом случае отказ [super init] определен (предполагается?), чтобы быть неисправимой ошибкой, так что сбой при сбой утверждение является оправданной.

Похоже, что соглашение о возврате nil предназначено для устранения ошибок, но в ситуациях, когда восстановление с ошибкой невозможно, разумно ли просто выкинуть утверждение?

Благодаря ...

Edit:

И не смотри также this question

+1

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

+0

Да, конечно. Я забыл, что утверждения часто отключены в сборках релизов. –

ответ

1

Нет возвращения nil, согласно обычной модели, достаточно. Ребенок должен решить, что с этим делать:

id obj = [[SomeObject alloc] init]; 
if (!obj) 
    [NSException raise:@"Oops"]; 
+0

Спасибо, @Droppy. Будет ли это применяться * в * инициализаторе? –

+0

Существует множество методов init, где возвращение nil является (обычным) нормальным и не оправдывает выброс исключения. – gnasher729

+0

@ gnasher729 Вот почему я говорю, что это зависит от вызывающего. – Droppy

Смежные вопросы