2012-02-09 14 views
5

nil değişkenini başlatmak iyi bir uygulamadır mı? Benim proje üzerinde analizörü çalıştırdığınızda çünkü bir uyarı almak soruyorumBir değişkeni sıfırlamak için iyi bir uygulama mı?

.

NSString *q; 

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) 
    { 
     sqlite3_step(statement); 
     selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)]; 
     sqlite3_finalize(statement); 
    } 

    sqlite3_close(database); 

    return q; //Undefined or garbage value returned to caller 

ben uyarı gitmiş kodunu değiştirmek zaman:

NSString *q = nil; 
+1

Derleyicinin bu desen hakkında yüksek sesle şikayet etmesi gerektiğini unutmayın. Daha iyi bir fikir, tekerleği doğrudan sqlite API kullanarak yeniden icat etmemek; Geliştirmenin daha hızlı ilerlemesini sağlayacak veya size bir bütün olarak sistemle çok daha iyi bir bütünleşme sağlayacak olan Çekirdek Verileri kullanabileceğiniz daha yüksek düzeyli API'ler sağlayan 3. taraf paketleyicileri vardır. – bbum

+0

Yorum için teşekkürler bbum. Kesinlikle haklısın. – objlv

cevap

11

ARC kullanıyorsanız, işaretçileriniz otomatik olarak sıfırlanacaklardır. Ancak, ARC kullandığınıza inanmıyorum, bu durumda işaretçinin bir çöp değeri olacaktır. Bu tehlikeli bir durumdur çünkü bu işlevin çağrıldığı kişi sonuca ulaşabilir ve işaretçinin, sıfır değerine eşit olmadığından geçerli bir şeye işaret ettiğini düşünebilir.

Evet, İşaretçilerinizi her zaman sıfır veya geçerli bir değere sıfırlayın. atama

Örnek 1 :: iyi bir örnek ilk gerekli değildir nil

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease]; 

Örnek atama 2 :: Kötü örnek ilk gerekli değildir nil

UIViewController *myVC = nil; // dumb since next line assigns it to valid value 
myVC = [[[UIViewController] alloc] init] autorelease]; 

Örnek 3 :: N'ye atamaya iyi örnek onditionally yeni bir değer

UIViewController *myVC = nil; // :D 
if (someCondition) 
{ 
    myVC = [[[UIViewController] alloc] init] autorelease]; 
} 
... 
0

Evet o iyi bir sonuçtur. Nil, bu değişkenin bellekte herhangi bir şeye işaret etmediğinin başka bir yoludur.

5

Evet. Eğer q sıfırlanmaya başlanmazsa, daha sonra yürütme sırasında gizli hatalar oluşturabilecek rastgele bir değere sahip olacaktır.

+0

Sıfır değerinin neden rasgele bir değerden daha az eğilimli olduğunu anlamıyorum. –

+0

@infact Örneğin, döndürülen değer daha sonra bir blokta kullanılırsa veya başka bir örnekte saklanırsa, kilitlenir. – ZelluX

+0

Bunu, değişkenleri otomatik olarak başlatmak için iOS 5'te değiştirdiklerini düşündüm. –

0

kullanılmadan önce bazı tanımlanan değere herhangi değişkeni ayarlamak için bir çok iyi uygulamadır olsun. Bunu yapmamak her türlü soruna yol açacaktır. Geri kalan, kullandığınız araçlara çok bağlıdır. Eğer bunu kullanabilir ya da nerede kullanılacağını önce derleyici o tanımlandığını ispat edemez önce tanımlanmamış bir değişken kullanıyorsanız

İyi derleyici söyleyecektir. Kötü bir derleyici (veya araçlarını nasıl kullanacaklarını bilmeyen bir geliştirici tarafından kullanılan iyi bir derleyici) bunu yapmayacaktır. İyi bir derleyici ile, sıfırlama veya NULL başlatma, derleyicinin işini düzgün şekilde yapmasını engelleyebilir. İşte

NSString* result; 
if (condition) result = @"True"; 
else if (otherCondition) result = @"False"; 
return result; 

tanımsız bir sonuç döndürebilir çünkü derleyici sizi uyarabilir: Gerçekten kod nil değil ama doğru olsun vermedi bir NSString dönmek istiyorum bu örneğine bakınız. Eğer sonuç sıfırlanırsa, yine de, nil 'i geri vermemesi gereken bir fonksiyonda sıfırlayabileceğiniz aynı probleminiz olur, fakat derleyici sizi uyaramaz. Öte yandan

, değer sıfır olabilir veya nil kabul edilebilir bir değerdir ve daha sonra nil başlatılıyor, bazı durumlarda farklı bir değere değişkeni ayarlamak için değil planlıyorsanız ince ve iyi gerekiyorsa uygulama.

Özet: Bir derleyiciyi kullanın ve başlatılmamış değişkenler kullanıp kullanmadığınızı söyleyecek şekilde düzgün şekilde ayarlayın. Başlatılmamış değişkenler hakkında bir uyarı alırsanız, sorunu düzeltin, uyarıyı değil.

İlgili konular