Обращение по нулевому указателю, но я не использую указатели - PullRequest
7 голосов
/ 30 июля 2010

Я сделал «Построить и проанализировать» в xCode и получить «Разыменование нулевого указателя» при установке нормального значения int в 0 в моем init-методе.Я отметил в своем коде ниже, для какой строки я получаю сообщение.Я разрабатываю для iPhone.

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

Это не полный код, вставьте то, что я считаю полезным.

Поскольку я не использую указатель, я нахожу это довольно странным.Как я могу получить это сообщение?

Спасибо и привет, Никлас

Ответы [ 3 ]

20 голосов
/ 30 июля 2010

Первый оператор if в вашем методе init проверяет, возвращает ли [super init] nil.(Технически это должно быть написано if ((self = [super init])), о чем вас предупредит новый компилятор LLVM.)

Статический анализатор проверяет ВСЕ возможные пути кода, даже в случае, когда [super init] возвращает ноль.В этом случае ваш оператор if не выполняется и self равен nil.Если self равно nil, то его переменные экземпляра недоступны.

Чтобы это исправить, вам нужно поместить инициализации внутри оператора if с инициализацией изображения, а затем return self внеесли заявление.

0 голосов
/ 30 июля 2010

Ваш метод инициализации неправильный.

Он должен выглядеть следующим образом:

- (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;
}

Я предполагаю, что вы получаете сообщение от статического анализатора.Поскольку stepX является переменной экземпляра, строка

stepX = 0;

действительно является сокращением для

self->stepX = 0;

, где -> имеет свое обычное значение C.Поскольку эта строка находится за пределами теста на то, что self не равно nil в вашем коде, статический анализатор отмечает проблему.

0 голосов
/ 30 июля 2010

Вы объявили это как собственность? Я не уверен, если это необходимо в этом случае, но вы не создали методы доступа (хотя я думаю, что вы все еще устанавливаете переменную экземпляра напрямую ...)

т.е. в вашем заголовочном файле

@property int stepX;

и в вашем .m файле

@synthesize stepX;

Это позволит вам получить доступ к переменной как self.stepX и self.stepY. Иногда анализатор делает ошибки, хотя ... Я заметил, что он не очень эффективно обрабатывает циклы while. В любом случае, посмотрите, что произойдет, если вы добавите эти строки кода и вернетесь ко мне.

...