2009-11-17 21 views
5

Objective C, NSMutableString'i sağlamaktan ziyade NSString sınıfını ve alt sınıf NSMutableString sınıfını neden sunar? NSString, "const NSMutableString" öğesine eşdeğer değil mi?Hem NSMutableString hem de NSString'e sahip olmanın amacı nedir?

C++ uygulamasında, yalnızca bir dize sınıfınız var, std :: string ve sabit istiyorsanız std: string olarak bir const belirtirsiniz.

Niçin NSMutableString'i her yerde kullanmam gerektiğini ve NSString ile hiç uğraşmamasını bilmek ister misiniz? Bir sebep olmalı ya da dil tasarımcıları her ikisini de sağlamayacaktı. Belki daha az depolama alır mı?

cevap

5

Her iki sınıfın da nedeni, bazen bir std :: string'i kullandığınız ve bazen bir const std :: string'i kullanmanızın aynı nedendir. Ancak, C++ 'dan farklı olarak, Objective-C'nin const yöntemleri yoktur, bu yüzden bunlar const-const-method'lardan iki farklı sınıfa ayrılırlar. Bu aynı zamanda NSArray (NSMutableArray), NSDictionary (NSMutableDictionary), vb. Gibi çekirdek sınıfların çoğunda da görülür.

0

Genel kuralın "amacına ihtiyacınız olmayan işlevsellik sağlamak olan bir sınıf kullanma" olduğunu söyleyebilirim. Bir dizenin içeriğini doğrudan değiştirmeniz gerekirse, NSMutableString'u kullanın. Değilse, NSString kullanın. Boyutları ve aldıkları yığın alanı açısından, sınıfların kendileri oldukça benzer olmalıdır.

+0

Kullanılacak sınıfı anlıyorum. Benim sorum, dil tasarımcılarının işlevselliği iki sınıfa ayırmayı tercih etmeleri nedeniydi? – progrmr

+0

İşlevselliği bölmek, ek işlevsellik gerekmediği durumlarda derleyicinin ve çalışma zamanının daha yüksek performans sunmasını sağlar. –

5

Bu, mümkün olsa bile ve hatta yalnızca dizeler olduğunda izin verilen en iyileştirmeler vardır. değişmezdir. ayıklayıcısında

NSString *A = @"Bob"; 
NSString *B = @"Bob"; 

çalışan Aslında

hemen aynı dizeye hem işaretçileri olduğunu göstermektedir. Aslında her ikisi de aynı hafıza adresini işaret eder. Bu arada farklı bir dizgiye işaret eden

.

Evet, NSStrings'in kullanılması bazı durumlarda daha verimlidir. Ve genel olarak, kakao kendisini düzenlenmiş olandan ziyade bir dizgenin yeni bir kopyasına geri götürür. Ancak, her yerde değişken bir dizge kullanmaman gerektiğini iddia edemiyorum, ancak çerçeve için genel kurallara aykırı görünüyor.

Kendi çalışmamda, yalnızca işleri doğrudan düzenlemem gereken değişebilir varyantları kullanıyorum. Bir const gerekmedikçe her şey değişebilir C/C++ tarzı biraz geriye doğru, mutability ihtiyacınız yoksa her şey const olduğunu.

+0

NSString * D = [E copy]; '' E 'ya da başka bir yeni dizgeye işaret eder? –

0

Değişmez bir dizenin kullanımı, derleyicinin değişmeyeceğini bilerek optimizasyon gerçekleştirebilen bir ipucudur.

+0

Testlerim gösterdiği gibi, çalışma zamanının nasıl davrandığını da etkiler. –

İlgili konular