Обращение по нулевому указателю, предупреждение - PullRequest
2 голосов
/ 02 января 2012

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

"PDFScrollView.h"

 #import "ENsightAppDelegate.h"
@interface PDFScrollView : UIScrollView <UIScrollViewDelegate> {

ENsightAppDelegate *appDelegate;
}

 @end

"PDFScrollView.m"

 - (id)initWithFrame:(CGRect)frame
{
if ((self = [super initWithFrame:frame])) {

    // Set up the UIScrollView
    self.showsVerticalScrollIndicator = NO;
    self.showsHorizontalScrollIndicator = NO;
    self.bouncesZoom = YES;
    //self.decelerationRate = UIScrollViewDecelerationRateFast;
    self.delegate = self;
    [self setBackgroundColor:[UIColor grayColor]];
    self.maximumZoomScale = 5;//200
    self.minimumZoomScale = 0.5;//.85
    self.userInteractionEnabled = YES;
    self.delaysContentTouches = YES;
    self.canCancelContentTouches = NO;

}
appDelegate =(ENsightAppDelegate *) [[UIApplication sharedApplication] delegate];
pdfView=[appDelegate GetLeaveView];
[self addSubview:pdfView];
return self;

}

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

Я нахожу это довольно странным. Почему я получил это сообщение?

enter image description here

Ответы [ 3 ]

8 голосов
/ 02 января 2012

Если self равно nil, вы не можете получить доступ к переменным экземпляра 'self'.Таким образом, вы должны ссылаться на эти переменные только внутри оператора if.Другими словами, только если я не ноль.

- (id)initWithFrame:(CGRect)frame {

   if ((self = [super initWithFrame:frame])) {

      // Set up the UIScrollView
      self.showsVerticalScrollIndicator = NO;
      // ... bunch of other properties set...
      // ... btw, better style here would be to set the ivars directly (in an initializer)

      appDelegate =(ENsightAppDelegate *) [[UIApplication sharedApplication] delegate];
      pdfView=[appDelegate GetLeaveView];
      [self addSubview:pdfView];
    }

    return self;
}
1 голос
/ 02 января 2012

является appDelegate экземпляром var класса? если это так, вы должны делать это в if (self =..... то же самое с [self addSubview...]. в основном, если это, если оператор терпит неудачу, у вас нет объекта для работы.

0 голосов
/ 02 января 2012

appDelegate на самом деле [self appDelegate], поэтому, если вы присваиваете null значение self, вы разыменовываете нулевой указатель.

В любом случае - self указывает на текущий объект, зачем вы его назначаете? Вы можете использовать его напрямую без назначения.

И последнее - вы все равно делаете явно используете self в строке «до и до последней», и здесь ясно, что это ноль:

[self addSubview:pdfView];
...