取消引用空指针,警告

时间:2012-01-02 07:08:15

标签: iphone objective-c debugging code-analysis

我在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 个答案:

答案 0 :(得分:8)

如果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 :(得分:1)

appDelegate类的实例变量吗?如果是这样,你应该在if (self =....中进行。与[self addSubview...]相同。基本上如果if语句失败,你就没有可以使用的对象。

答案 2 :(得分:0)

appDelegate实际上是[self appDelegate],因此如果您为self指定null,则取消引用空指针。

无论如何 - self指向当前对象,为什么要分配给它?您无需转让即可直接使用它。

最后一点 - 你无论如何都要在最后一行显式地使用self,这里很明显它是null:

[self addSubview:pdfView];