2010-10-12 21 views
7

Ben benzer fonksiyonları bir dizi var şu:Birinin beklenmediği değişebilir bir nesneyi iade etmemek için herhangi bir sebep var mı?

+ (NSArray *)arrayOfSomething 
{ 
    NSMutableArray *array = [NSMutableArray array]; 

    // Add objects to the array 

    return [[array copy] autorelease]; 
}

Sorum bu yöntemin son satırında hakkındadır: daha iyi değişken nesneyi döndürmek ve bir kopyalama işlemi önlemek veya değişmez bir dönüş etmektir anlaşıldı mı? Beklenmeyen bir nesneyi beklemekten kaçınmanın iyi bir nedeni var mı?

+0

Elbette verdiğiniz örnek, ilk önce bir kopya oluşturmadan orijinali geri gönderebilir. Ayrıca, bunun bir sınıf yöntemi olduğu (ve bu arada bir işlev olmadığı) göz önünde bulundurulduğunda, her seferinde dizinin yeni bir örneğini oluşturmaya gerçekten ihtiyacınız var mı? Kopyayı önbelleğe aldıysanız, nokta oldukça fazla olacaktır. – jlehr

+0

+1 çünkü tüm Objective-C programcılarının cevabı araştırırken bilmesi gereken önemli bir şey öğrendim. – JeremyP

cevap

4

Bu karmaşık bir konu. Sizi Apple'ın yönergelerine object mutability numaralı telefondan göndermenin en iyi yolu olduğunu düşünüyorum. , alıcı getiri biçimsel türü güvenmek zorundayız bu alınan nesne değiştirip değiştiremeyeceğini

belirlemek için:

Apple bu bir iade nesnenin mutability belirlemek için iç gözlem kullanmanın konuda söyleyeceklerini değer. Örneğin, immutable olarak yazılan bir dizi nesnesini alırsa, değiştirmeyi denememelidir. Bir nesne sınıfı üyeliklerine göre değişken olup olmadığını belirlemek için kabul edilebilir bir programlama uygulama değildir

makalede üzerinde iç gözlem kullanmamalısınız neden birkaç çok iyi nedenleri vermek için gider (vurgu bana ait) örneğin değiştirip değiştiremeyeceğinizi belirlemek için döndürülen bir nesne

Bir dosyadan bir özellik listesini okuyorsunuz. Vakıf çerçevesi listeyi işlediğinde, mülkiyet listesinin çeşitli alt kümelerinin aynı olduğunu fark eder, böylece tüm alt kümeler arasında paylaştığı bir dizi nesne oluşturur. Daha sonra oluşturulan özellik listesi nesnelerine bakarsınız ve bir alt kümeyi değiştirmeye karar verirsiniz. Aniden ve farkında olmadan, ağacı birden çok yerde değiştirdiniz.

ve

Bunu subviews (subviews yöntemi) için NSView sormak ve bir NSArray olduğu belirtilmesine rağmen hangi dahili bir NSMutableArray olabilir bir nesne döndürür.Sonra bu diziyi başka bir koda geçirirsiniz, bu da iç gözlem yoluyla değişebilir olmasını ve değiştirilmesini belirler. Bu diziyi değiştirerek, kod NSView’in iç veri yapılarını mutasyona uğratıyor.

, yukarıda Verilen size örnekte değişken dizi dönmek için (elbette sağlanan o zaman sözleşme kırma olacağını, çünkü bunu iade ettikten sonra kendiniz mutasyona asla) mükemmel kabul edilebilir.

Bunu söyledikten sonra, Kakao Nesneleri Kılavuzu'nun bu bölümünü hiç kimse okumamıştır; bu nedenle, savunma programlaması değişmez bir kopyasını yapmanız ve performans profili oluşturma işleminin bunun bir sorun olduğunu göstermedikçe geri dönmeniz için sizi çağırır.

+1

Adam, bu belgeye birçok kez başvurdum ve her nasılsa bu bölüme geçtiniz. Ben tam olarak savunmak istediğin bir programcıyım. (Benim "savunmamda", asla bir nesnenin mutabilitesini test etmedim.) –

+1

@Robot K: Kulübüne katılın. Kubi'nin cevap gösterilerine eklediğim ilk yorumum olarak, bu soruya konuyla ilgili bir araştırma yapmaya karar vermemiş olsaydım, döndürülen değişmez nesneler hakkında iç gözlemi kullanmanın meşruluğunu asla sorgulamadım. Yine de senin gibi, hiç böyle bir şey denemedim. – JeremyP

+0

Benzer bir uyarı için NSObject isKindOfClass: yöntemi belgelerine bakın: http://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/Protocols/NSObject_Protocol/Reference/NSObject.html#//apple_ref/oks/intfm/NSObject/isKindOfClass: – titaniumdecoy

3

Kısa Cevap (Ben NSArray bir alt sınıfıdır çünkü bir NSMutableArray dönmek yasal olduğunu biliyoruz Sorum bunun iyi bir fikir olup olmadığını değil..): O

yapmayın

Uzun Yanıt: Bu bağlıdır. Dizinin statik olmasını beklediği biri tarafından kullanıldığında dizi değişiyorsa, izlenmesi gereken bir acı veren bazı şaşırtıcı hatalara neden olabilirsiniz. Yaptığınız gibi kopyala/otomatikleştirmeyi yapmak ve sadece geri gelmek ve önemli bir performans isabeti ortaya çıktığında bu yöntemin dönüş türünü tekrar gözden geçirmek daha iyi olacaktır. Yorumlara yanıt olarak


, ben kesilebilir bir dizi dönen, herhangi bir sorun, ancak neden olacak bu sorun neden yoksa, o konu tam olarak ne izini zor olabilir olası olduğunu düşünüyorum. Değişken dizinin bir kopyasının büyük bir performans isabeti olduğu ortaya çıkarsa, sorunun nedenini belirlemek çok kolay olacaktır. İki olası olmayan sorun arasında bir seçim var, çözülmesi kolay, biri çok zor.

+0

Garip bir şeyin olacağı gerçek bir yaşamı isimlendirir misiniz? Aklımda, fark edilmeyen diziyle karıştırmak oldukça zor olurdu - derleyiciden gelen her "normal" yöntem çağrısı için bir uyarı alacaksınız. Tabii ki, seçmenler ve arkadaşlar var, ama bunun yanında ..? –

+1

Satırın aşağısında bir yer, sınıfın değişebilir olup olmadığını sınayabilir ve değiştirebilir. Değişmez bir dizi bekleyen diğer sınıflar için sorunlu olacaktır. Muhtemelen süper değil, ama olabilir. –

+0

Ayrıca, bazı sınıflar (özellikle çerçeve sınıfları) değişebilen bir diziden geçip geçmediklerini kontrol eder ve sonra kopyalayabilir. Değişmez bir dizinin döndürülmesi bu adımı atlardı. –

İlgili konular