2012-03-24 14 views
7

Dość proste pytanie:Obj-C: NSError w inicjatorze

Mam metodę init na mojej klasie, która może się nie udać. Jeśli tak, planuję "zwrócić zero", ale chciałbym również zwrócić błąd. Czy jest złym zwyczajem mieć parametr NSError ** do metody init? Moja deklaracja metoda będzie wyglądać następująco:

- (id) initWithArgs:(NSString*) args andError:(NSError**)error; 

Wielkie dzięki, Nick

Odpowiedz

7

To niezwykłe, ale nie sądzę, że to koniecznie złą praktyką. Drugą część metody nazwałbym "błędem" zamiast "andError:". Nie trzeba łączyć części nazwy metody z "i", iw tym przypadku daje to również wrażenie, że błąd jest używany do zainicjowania obiektu. Wystarczy zrobić to:

- (id) initWithArgs:(NSString*) args error:(NSError**)error; 

Ponadto, nie zapomnij, aby zwolnić przydzielonego obiektu, jeśli masz zamiar powrócić coś innego (jak nil):

- (id) initWithArgs:(NSString*) args error:(NSError**)error 
{ 
    if ((self = [super init])) { 
     if (canInitThisObject) { 
      // init this object 
     } 
     else { 
      [self release]; 
      self = nil; 
      if (error != nil) { 
       *error = [NSError errorWithDomain:someDomain code:someCode: userInfo:nil]; 
      } 
     } 
    } 
    return self; 
} 
+1

Jedno Polecam ZAWSZE jest ustawienie do błędu zero na początku metody. Nie ma gwarancji, że wywołujący ją wyzeruje. – EricS

+4

@EricS Nie ma powodu, aby ustawić 'error' na' nil', chyba że wystąpił błąd. Dzwoniący nie powinien nigdy patrzeć na wartość '@ error', chyba że metoda zwróci' nil'. Inaczej jest to błąd. @Caleb ten kod musi sprawdzić, aby upewnić się, że 'error' ma wartość inną niż NULL przed przypisaniem do' * error'. – bbum

+0

@bbum Dzięki - naprawione. – Caleb

Powiązane problemy