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

  • My name is Festis and I'm free

    My name is F

    2 EKİM 2011
  • Jejoab

    Jejoab

    4 NİSAN 2008
  • SHAYTARDS

    SHAYTARDS

    1 EKİM 2008