Я сделал "Сборку и анализирую" в 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
Первый оператор if
в вашем методе init проверяет, возвращает ли [super init]
nil
. (Технически это должно быть написано if ((self = [super init]))
, о чем новый компилятор LLVM предупредит вас).
Статический анализатор проверяет ВСЕ возможные пути кода, даже тот случай, когда [super init]
возвращает nil. В этом случае ваш оператор if
не сработает и self
будет nil
. Если self
является nil
, то его переменные экземпляра недоступны.
Чтобы исправить это, нужно поместить инициализацию внутри оператора if
с инициализацией изображения, а затем return self
вне оператора if.
Вы задекларировали это как собственность? Я не уверен, что это необходимо в данном случае, но вы не создали методы доступа (хотя я думаю, что вы все еще устанавливаете переменную экземпляра напрямую ...)
то есть в вашем файле заголовка,
@property int stepX;
и в ваш .m файл,
@synthesize stepX;
Это позволит вам получить доступ к переменной как self.stepX и self.stepY.
Хотя иногда анализатор ошибается ... Я заметил, что он не очень эффективно обрабатывает , а
зацикливается. В любом случае, посмотрим, что произойдет, если вы добавите эти строки кода и вернетесь ко мне.
Ваш метод 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 в вашем коде, статический анализатор отмечает проблему.