Разыменуйте нулевого указателя, но я не использую указатели

Я сделал "Сборку и анализирую" в XCode и добираюсь, "Разыменовывают нулевого указателя" при установке нормального интервала на 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

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

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

Спасибо и наилучшие пожелания, Niklas

7
задан Nicsoft 30 July 2010 в 08:46
поделиться

3 ответа

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

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

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

20
ответ дан 6 December 2019 в 09:17
поделиться

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

то есть в вашем файле заголовка,

@property int stepX;

и в ваш .m файл,

@synthesize stepX;

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

0
ответ дан 6 December 2019 в 09:17
поделиться

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

Он должен выглядеть так:

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

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

0
ответ дан 6 December 2019 в 09:17
поделиться