2013-09-05 17 views
5

Objective-C belgelerinde de okuduğum Objective-C örneklerinin çoğunda, nesneler her zaman kullanımdan önce başarılı bir şekilde tamamlanma açısından kontrol edilir. ÖrneğinBu nesnelerin gerçekten ayrıldığını kontrol etmemiz gerekiyor mu?

:

MyObject *myObject = [[MyObject alloc] init]; 
if (myObject){ 
    //do stuff with the object 
} 
//stuff beyond here is probably not going to work if myObject is nil 

bu hataları izlemek zor yapmaz mı? Tahsisin neden düşük bellek dışında neden başarısız olacağından emin değilim, ancak bir nesneyi başlattıktan hemen sonra Java'da (geçiş yaptığım dil) yapılan böyle bir kontrol görmedim.

Her bir tahsisini kontrol edip başarısız tahsislere tepki vermeye çalıştıysanız, uygulamanın çok kıvrımlı bir hale geleceğini varsayalım. Sanırım birçok durumda kullanıcıya bir hata mesajı gösterebilirsiniz, ancak programdaki şube sayısı muhtemelen iki katına çıkacaktır.

Ancak, gördüğüm örneklerde, kullanıcıların ekranda ne beklediklerini görmeleri için gerekli olan bazı kodları atlamanın yanı sıra, ayırma başarısız olduğunda hiçbir şey yapmıyorlar. Başarısız tahsisatların uygulamada gerçekten çok fazla gerçekleşip gerçekleşmediği ve bu kodlama stilini izlediyseniz, sonuçta kullanıcı ve programcının habersiz olduğu, kullanıcı tarafından kaydedilmiş olduğunu düşündüğü, kaydedilmeyen kaydedilmiş belgeler, kaydedilmemiş belgeler olacaktır.

DÜZENLEME: İşte Apple'ın öğreticisinden "Üçüncü iOS Uygulamanız: iCloud" örneğidir. başlatma başarısız olursa

- (NSMetadataQuery*)textDocumentQuery { 
    NSMetadataQuery* aQuery = [[NSMetadataQuery alloc] init]; 
    if (aQuery) { 
     // Search the Documents subdirectory only. 
     [aQuery setSearchScopes:[NSArray 
        arrayWithObject:NSMetadataQueryUbiquitousDocumentsScope]]; 

     // Add a predicate for finding the documents. 
     NSString* filePattern = [NSString stringWithFormat:@"*.%@", 
        STEDocFilenameExtension]; 
     [aQuery setPredicate:[NSPredicate predicateWithFormat:@"%K LIKE %@", 
        NSMetadataItemFSNameKey, filePattern]]; 
    } 

    return aQuery; 
} 
+6

Bunu hiç görmedim kod böyle basit bir durumda. Gördüğün gerçek bir örnek sunabilir misin? – Chuck

+0

en azından ios'da, eğer 'tahsis', 'bellek' için bir sebepten ötürü geri döndüyse, uygulamanız her neyse, yine de tarafından öldürülecektir. –

+0

@Chuck Bir örnek ekledim. – Tenfour04

cevap

5

başlatıcıları initWithFile: varolmayan bir yol verilirse bu örnek için olabilirdi, nil dönmelidir. Eğer nil ileti gönderebilir Objective-C ise

(aksine örneğin C++ Eğer NULL bir yöntemi çağırmak olamaz nerede), bu yüzden if (object) o nesne üzerinde çalıştırmadan önce gerekli değildir denetleme. Bu anObjectnil

Yani soruyu cevaplamak için ise, bir istisna olur

SomeClass *anObject = [SomeClass alloc] initializerThatMightReturnNil] 
[anArray addObject:anObject] 

: Bir dizide nesneyi eklemek istiyorsanız Öte yandan, bunu nil olmadığını kontrol etmelidir : Her başlatmadan sonra nil'u kontrol etmek genellikle gerekli değildir, sadece nesnenin sıfır olması durumunda ne olacağını anladığınızdan emin olun.

+0

Açıklama için teşekkürler. Sadece Apple'ın öğreticilerinden bir örnek ekledim. Bir NSMetadataQuery'yi hiçbir argüman almayan bir başlatıcı ile ayırır ve başlatır. Ve eğer yapmış olsa bile, nil için test ederek hatayı gizlemek istemeyeceğinizi düşünürdüm ... atılan bir istisna olmasını istersiniz, böylece testi yaparken hatayı kolayca takip edebilirsiniz. Ama bu durumda, referansın neden argüman olmadan başlatılmasının hemen ardından nil olacağını bilmiyorum. – Tenfour04

+1

@ Tenfour04 - Apple'ın örneklerinde çok tuhaf şeyler var. Nil'in kontrol edilmesinin istendiği özel durumlar vardır, fakat genel durumda, geri gönderilirse, uygulama ortamının ciddi bir şekilde etkilenmesi ve sadece "doğal olarak" çökme olayının tamamen başarısız olmasından kaynaklanır. –

+0

(Sadece yukarıdaki yorumun bağlamdan alınmadığından emin olmak için, burada bir nesne işaretçisi döndüren bir yöntem çağrısının genel durumu değil, burada tahsis/init çağrıları hakkında konuşuyoruz.) –

İlgili konular