我在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;
}
这不是完整的代码,粘贴了我觉得有用的东西。
我发现这很奇怪。我怎么得到这个消息?
答案 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];