2010-07-30 15 views
7

xCode'da "Oluştur ve çözümle" yi yaptım ve init yöntemimde normal bir int 0'ı ayarlarken "Boş göstericinin yokluğu" iletisini aldım. Mesajımı aldığım satır için aşağıdaki kodumda not aldım. IPhone için geliştiriyorum.Boş işaretçiyi belirtme, ancak işaretçileri kullanmıyorum

Bric.m

#import "Bric.h" 

@implementation Bric 

- (id)initWithImage:(UIImage *)img:(NSString*)clr{ 
    if (self = [super init]) { 
     image = [[UIImageView alloc] initWithImage:img]; 
    } 

    stepX = 0; //It's for this line I get the message 
    stepY = 0; 
    oldX = 0; 
    color = [[NSString alloc]initWithString:clr]; 
    visible = YES; 
    copied = NO; 
    return self; 
} 
@end 

Bric.h

#import <Foundation/Foundation.h> 

@interface Bric : NSObject { 

    int stepX; 
    int stepY; 

} 

-(id)initWithImage:(UIImage *)img:(NSString *)clr; 

@end 

Ben yararlı olduğunu düşünüyorum yapıştırılan tam kod değil.

İşaretçi kullanmıyorum bu yana oldukça garip buluyorum. Bu mesajı nasıl alırım?

Teşekkür ve Saygılarımızla, Niklas

cevap

20

Sizin init yönteminizdeki ilk if bildirimi, [super init]'un nil değerini döndürüp döndürmediğini kontrol eder. (Teknik olarak, yeni LLVM derleyicisinin sizi uyaracağı if ((self = [super init])) yazılmalıdır).

Statik çözümleyici, [super init] öğesinin nil döndürdüğü durumda bile TÜM olası kod yollarını denetliyor. Bu durumda, if ifadeniz başarısız olur ve self, nil'dur. self, nil ise, örnek değişkenlerine erişilemez.

Bunu düzeltmek için, başlatma ifadelerini if ifadesinin içine, resim ifadesiyle ve ardından if ifadesinin dışında return self yerleştirmeniz gerekir.

+0

Teşekkürler, şimdi anlıyorum. Bu sorunu çözdü. Sanırım "eğer ((öz = [süper init]))" yazmam gerekmiyor, "diyorsunuz, sadece pedagojik tepkiler için mi yazdınız? Daha önce hiç çift parantez görmemiştim. – Nicsoft

+2

Çift parantezler, derleyicinin önce 'self = [super init]' i değerlendirmesini ve sonra sonucu bir boolean olarak değerlendirmesini söyler. Yeni LLVM derleyicisiyle, bir "if" ifadesindeki bir atamanın etrafında çift parantez bulunmaması, bir uyarıcı oluşturacaktır, çünkü derleyici, "=" yerine "=" ('(x == 5)' e benzer bir şey yaparken yanlış bir yanlıştır. – Jasarien

0

bir mülkte olarak ilan mı? (... Hâlâ doğrudan örnek değişkeni ayarlarken düşünüyorum rağmen) ben bu durumda gerekli olup olmadığından emin değilim ama bir erişim yöntemine yapmamış

yani senin başlık dosyasında,

@property int stepX; 

ve .m dosyasında ,

@synthesize stepX; 

Bu self.stepX ve self.stepY olarak değişken erişmesine izin verir. Bazen analizör hataları yapar ... while döngülerinin çok etkili bir şekilde ele alınmadığını fark ettim. Her neyse, bu kod satırlarını ekleyip bana geri dönersen ne olacağını gör.

+0

Cevabınız için teşekkür ederiz. Ama bu yardımcı olmadı, ve bir ilkel olduğundan, yanılmamam gerekirse (en azından hiç bir zaman yapmadım ve bununla hiç bir problemim olmadıysa) gerekli olmamalıydı. – Nicsoft

+0

Aslında, benim tecrübelerime göre analizör, döngüleri oldukça iyi idare ediyor. İşaretlenen sorunların gerçek olmadığından tamamen emin misiniz? – JeremyP

+0

Oldukça emin. "Yapılmadığı sırada" bir döngü idi ve "yapılmayan" değişkenin (döngü sırasında yanlış olarak ayarlanmış) "ayarlandığını, ancak asla okumadığını" söyledi. Yardımcı olmayan gönderi için üzgünüz. – Helen

0

Init yönteminiz yanlış.

Bu gibi görünmelidir:

- (id)initWithImage:(UIImage *)img:(NSString*)clr 
{ 
    if (self = [super init]) // NB, this line should give you a waring 
    { 
     image = [[UIImageView alloc] initWithImage:img]; 
     stepX = 0; //It's for this line I get the message 
     stepY = 0; 
     oldX = 0; 
     color = [[NSString alloc]initWithString:clr]; 
     visible = YES; 
     copied = NO; 
    } 
    return self; 
} 

Sana alıyorsanız mesajı statik analizörü dan olduğunu varsayalım. stepX bir örnek değişkeni, çizgi olduğu gibi

stepX = 0; 

gerçekten -> normal C anlamı vardır

self->stepX = 0; 

için kısaltmadır.Bu satır, kodun kendisinde nil olmayan bir testin dışında olduğundan, statik analiz cihazı bir sorunu işaretlemektedir.

+0

Cevabınız için teşekkür ederiz. Neden "if (self = [super init])" diye bir uyarı almalıyım? eski kodumu ve sağladığınız değişiklikleri kullanırken ... Uyarı, if-cümleden sonra ilk satırdaydı, yukarıdaki kodumda "stepX = 0;" yazıyordu. Sanırım analizörün yolu budur stepX-satırının orada olmamasını söylemek için (ve stackoverflow ile birlikte bana if-cümlede olması gerektiğini bulmak zorundadır ...) – Nicsoft

+0

Yanlışlıkla yazmaktan korunmak için bir güvenlik özelliği = ortalama ==. Bu uyarı kapatılmış olabilir. – JeremyP

İlgili konular