2010-11-03 13 views
6

Sınıfımızda init yöntemini uygulamak istemiyorsak ve NSObject öğesinde init'in başlatılmadan yalnızca bir nesne örneğini döndürdüğünü aklımızda tutuyorsak, örneği zaten alırsak init çağırma noktasını göremiyorum tahsisli. Denedim ve çalışıyor, ama gelecekteki sorunlara neden olmayacağından emin değilim.Sadece init olmadan doğru/elverişli kullanım mı olur?

myClass *newObject = [[myClass alloc] init]; 

teşekkür çok: yerine

myClass *newObject = [myClass alloc]; 

.

cevap

16

Hayır, yalnızca alloc numaralı telefonu arayın. alloc, init nesnesinin tüm örnek değişkenlerini sıfırlar ve tüm veya bazı örnek değişkenlerini varsayılan değerlerine ayarlama şansına sahiptir. Bazı sınıflar, başka bir örnek oluşturmak için init yöntemlerini kullanırlar ve ayırdığınızın yerine onu döndürürler.

Birçok sınıf, init yöntemlerinin çağrılmasını bekler ve init numaralı telefonu aramazsanız çökmelere neden olabilir. Doğrudan NSObject'dan miras alınan ve örnek değişkenlerinin başlatılması gerekmeyen bir özel sınıftan bahsediyorsanız, [myClass alloc] ile çıkabilirsiniz, ancak kesinlikle iyi bir programlama stili değildir.

+0

Açıklama için çok teşekkürler. "Doğrudan NSObject öğesinden devralınan ve örnek değişkenlerinin başlatılmasına gerek olmayan bir özel sınıftan bahsediyorsanız, [myClass alloc] ile çıkabilirsiniz, ancak bu kesinlikle iyi bir programlama stili değildir." Benim durumum buydu. Cevap kabul edildi. – toupper

+2

@toupper: Daha kısa bir sözdizimi istiyorsanız, '[myClass new];' '[[myClass alloc] init];' 'e eşdeğerde bulunabileceğinizi, ancak vogue içinde olduğu düşünülemez. . –

2

Bunun iyi bir fikir olmadığını düşünüyorum.
Oku Kakao Tasarım Deseni, özellikle "İki aşamalı oluşturma"

Ayrıca http://www.informit.com/articles/article.aspx?p=1398610

+0

Çok teşekkürler, yararlı bilgiler. – toupper

+0

"Kakao Tasarım Kalıbı - İki aşamalı oluşturma" noktasını tam anlamıyla anlayamadım: iki aşamalı oluşumun daha iyi olduğunu iddia ediyor çünkü "yapıcılar/sınıf yöntemleri/fabrika yöntemleri" nin patlamasını önler, ancak java ile karşılaştırılamaz. [[Foo alloc] init] Foo f = new Foo() ile aynıdır; f.init() ;? –

0

Ben bunun önemi yok bir "uygulamak vermedi olsaydı düşünüyorum bu yazıyı okuyabilir - (id) init çünkü eğer yapmış olsaydınız, NSObject init yöntemini çağırırsınız, bu yöntemde sadece yöntemle gönderdiğiniz aynı değeri döndürür. Örnek değişkeninizi ayarlamak için kendi init yönteminizi oluşturmak iyi bir fikir olsa da.

İlgili konular