2009-11-23 15 views
37

Benim iPhone uygulaması ile bazı bellek sorunları ayrıştırılması ve ben de bazı temel düşünüyordum. Eğer bir ivar kurarsam ve nesnemin ömründe onu asla kullanmazsam, üzerinde dealloc dediğimde sorun olur mu? Örneğin.Örnek değişkenler varsayılan olarak Objective-C'de sıfır olarak ayarlandı mı?

@interface testClass { 
    id myobject; 
} 
@property (nonatomic, retain) id myobject; 
@end 

@implementation testClass 
@synthesize myobject; 
- (id)init { 
    ... 
    // Do I have to set myobject to nil here? 
    // So if myobject isn't used the dealloc call to nil 
    // will be okay? Or can you release the variable without 
    // having set every object to nil that you may may not use 
    ... 
} 

... 

// Somewhere in the code, myobject may be set to 
// an instance of an object via self.myobject = [AnObject grabAnObject] 
// but the object may be left alone 

... 

- (void)dealloc { 
    [myobject release]; 
    [super dealloc]; 
} 
@end 
+0

Mike Abdullah: Benim düzenlemede bu değişikliği yaptık. –

+0

Doğru doğru, böylece bir işlevde oluşturulan normal değişkenler, daha sonra bildirdiğinizde 0/nil olarak ayarlanmadı mı? Sadece örnek değişkenler. Öyleyse, normal değişkenlerin, onu açıkça bir şeye ayarlayana kadar 'çöp' içereceğini doğru mu? –

+0

Bu doğru. –

cevap

0

Ben iyi bir uygulama her zaman init yöntemde nil için bu ivars ayarlamaktır bulmak. Bu şekilde, destroyerindeki release aramanızın sorun yaratamayacağından kesinlikle eminsiniz. Bunu açar,

o zaman kaldırma endişelenebilirsin, bu Objective-C otomatik nil bunları ayarlamak etmez ve nedense sen (yüksek ihtimal) bu atamaları kaldırarak üzerine geliştirilebilir bir hız darboğaz ile kendinizi bulmak onlar. Bu arada, nil hepsini kurmak ve uyku kolay :)

güncelleme: BJ Homer ve Chuck dikkat çekmişlerdir otomatik sıfıra ayarlanır Ivars, demek ki bu bir kararla aşağı geldiğini tarzı.

+3

Her iki şekilde de emin olabilirsiniz. Tek bir şekilde init yönteminiz işe yaramaz görevlerle doludur. – Chuck

+0

teşekkürler yazmak zorunda değilsiniz koddur. Bir dil garantiler veriyorsa, bunları kullanın. Eğer (Ivars ait nilling gibi) dilin temellerini belgeleri şüphe başlarsanız o zaman gerçek bir tavşan deliğinden konum. –

+0

iyi kod :-) Cevabınız için – occulus

11

Evet, ivars are always initialized to 0/nil/NULL/NO/etc. Eğer ne olup bittiğini anlamasına yardımcı olur eğer

Ancak, bunun için gidin. Performans etkisi ihmal edilebilir. Bunu yapmana gerek yok, ama eğer sorun çıkarsa sorun olmayacaktır.

+10

Zararsız, gereksiz kodun iyi uygulama olduğunu göremiyorum. Tüm yerel değişkenleri, gerçekten açık hale getirmek için bir satırda aynı değere birkaç kez ayarladığınızdan emin misiniz? – Chuck

+11

Hayır. Yerel değişkenleri birçok kez ayarlamak, kodun açıklığını azaltır ve karışıklığı artırır. Açıkça bir ivar koyma netliği artırır ve yeni bir takımın objec ile daha az aşina olduğu, ne olduğunu daha kolay anlar. Kod berraklığı, "boşa harcanmış" kodu azaltmadan daha önemlidir. –

+2

Amaç-C geliştiricileri, ivarların sıfır başlatılması hakkında bilgi sahibi olmalıdır. Sıfırlama nedeniyle 'init' yöntemleri çoğu zaman ihmal edilebilir, bu iyi bir şeydir. Geliştiriciler hala öğreniyorlarsa, bu kavramı koddan değil, bir kitaptan, eğitmenden, SO'dan ya da her neyse öğrenmemelidirler. Zaten gereksiz kodu okuyarak bu kavramı öğrenemezlerdi. –

İlgili konular