SORU
24 Mayıs 2009, Pazar


Neden NSError çift yönlendirme ihtiyacı var mı? (bir işaretçi işaretçi)

Bu kavram beni rahatsız görünüyor. Neden NSError bir nesne işaretçisini nesnenin değiştirme bir yönteme geçirilen ihtiyacı var mı? Örneğin, sadece bu hata için bir başvuru geçirmeden aynı şeyi yapmaz mıydın?

NSError *anError;
[myObjc doStuff:withAnotherObj error:error];

ve doStuff sonra:

 - (void)doStuff:(id)withAnotherObjc error:(NSError *)error 
 {
    // something went bad!
    [error doSomethingToTheObject];
 }

Neden yukarıda diğer birçok nesne örüntüleri çalışma mesajlaşma gibi çalışmıyor mu? Neden hata: (**NSError)hata yerine kullanmak gerekir?

CEVAP
24 Mayıs 2009, Pazar


NSError** desen bir yöntem normalde bir değer verir, ama bunun yerine eğer başarısız olursa bir hata nesnesi (tür NSError*) geri dönmek gerekebilir zaman kullanılır. Objective-C metodu sadece tek bir nesne türü dönebilirsiniz, ama bu iki iade etmek istediğiniz bir durumdur. Fazladan bir değer döndürmek için ihtiyacınız olduğunda C-sordun türü değeri için bir işaretçi için dilde, yani NSError* dönmek NSError** bir parametre gerekir. Daha gerçekçi bir örnek bu olabilir:

// The method should return something, because otherwise it could just return
// NSError* directly and the error argument wouldn't be necessary
- (NSArray *)doStuffWithObject:(id)obj error:(NSError **)error
{
  NSArray *result = ...;  // Do some work that might fail
  if (result != nil) {
    return result;
  } else {
    // Something went bad!
    // The caller might pass NULL for `error` if they don't care about
    // the result, so check for NULL before dereferencing it
    if (error != NULL) {
      *error = [NSError errorWithDomain:...];
    }
    return nil;  // The caller knows to check error if I return nil
  }
}

Eğer sadece NSError* bir parametre yerine NSError** olmasaydı doStuff asla hata nesne arayana geri geçmek mümkün olacaktır.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DavidParody

    DavidParody

    17 EKİM 2009
  • DeAdPiXel6667

    DeAdPiXel666

    2 Ocak 2010
  • theavettbrothers

    theavettbrot

    9 ŞUBAT 2007