Ios 应用程序在响应Tappiration时崩溃

Ios 应用程序在响应Tappiration时崩溃,ios,objective-c,Ios,Objective C,基本上,我有一个UIViewController,其中包含一个构建用于在UIScrollView中保存内容的xib。这是通过RSS提要填充的。这正如预期的那样有效。我想要点击视图控制器拥有的UIView,以响应点击并继续前进。但是,点击会导致应用程序崩溃,并出现“无法识别的选择器发送到实例”错误。我真的不知道发生了什么事 xib视图控制器的.h文件如下所示: @property (nonatomic,retain) IBOutlet UIImageView *article_image; @pr

基本上,我有一个UIViewController,其中包含一个构建用于在UIScrollView中保存内容的xib。这是通过RSS提要填充的。这正如预期的那样有效。我想要点击视图控制器拥有的UIView,以响应点击并继续前进。但是,点击会导致应用程序崩溃,并出现“无法识别的选择器发送到实例”错误。我真的不知道发生了什么事

xib视图控制器的.h文件如下所示:

@property (nonatomic,retain) IBOutlet UIImageView *article_image;
@property (nonatomic,retain) IBOutlet UILabel *article_title;
@property (nonatomic,retain) IBOutlet UILabel *article_date;
@property (nonatomic,retain) IBOutlet UIActivityIndicatorView *spinner;

@property (nonatomic,retain) NSString *preview_image;

- (void) loadPreviewImage;
- (void)viewDidLoad {

    [super viewDidLoad];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGesture)];
    singleTap.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:singleTap];

    self.view.layer.shadowColor = [UIColor blackColor].CGColor;
    self.view.layer.shadowOpacity = 0.6;
    self.view.layer.shadowRadius = 1.5;
    self.view.layer.shadowOffset = CGSizeMake(0, 0);

}

- (void) singleTapGesture:(UITapGestureRecognizer *)gesture {
    NSLog(@"TAPPED!");
}
然后.m文件如下所示:

@property (nonatomic,retain) IBOutlet UIImageView *article_image;
@property (nonatomic,retain) IBOutlet UILabel *article_title;
@property (nonatomic,retain) IBOutlet UILabel *article_date;
@property (nonatomic,retain) IBOutlet UIActivityIndicatorView *spinner;

@property (nonatomic,retain) NSString *preview_image;

- (void) loadPreviewImage;
- (void)viewDidLoad {

    [super viewDidLoad];

    UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGesture)];
    singleTap.numberOfTapsRequired = 1;
    [self.view addGestureRecognizer:singleTap];

    self.view.layer.shadowColor = [UIColor blackColor].CGColor;
    self.view.layer.shadowOpacity = 0.6;
    self.view.layer.shadowRadius = 1.5;
    self.view.layer.shadowOffset = CGSizeMake(0, 0);

}

- (void) singleTapGesture:(UITapGestureRecognizer *)gesture {
    NSLog(@"TAPPED!");
}
即使我只在xib中放置一个简单的roundrectbutton并将其连接到iAction,它也会崩溃,因此我认为我的xib的设置方式有问题,但我不知道是什么。.h中的那些属性可以通过保存scrollview的VC很好地填充,因此xib显然知道它所关联的文件,所以我无法理解它为什么会崩溃并在点击时抛出错误。

修复方法如下:

 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGesture:)];
请注意选择器末尾的

实际上,您的操作方法签名是:

- (void) singleTapGesture:(UITapGestureRecognizer *)gesture;

@selector(singleTapGesture)
我宁愿确定:

- (void) singleTapGesture;
希望这能澄清问题。

解决方案如下:

 UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGesture:)];
请注意选择器末尾的

实际上,您的操作方法签名是:

- (void) singleTapGesture:(UITapGestureRecognizer *)gesture;

@selector(singleTapGesture)
我宁愿确定:

- (void) singleTapGesture;

希望这能澄清问题。

好吧,我从来没有真正弄清楚到底是什么导致了崩溃-所以我将手势识别器添加到构建对象的循环中,效果非常好。不是我想怎么做(我试图把它保存在对象的类定义中),而是随便什么。也许这会帮助其他人

好吧,我从来没有真正弄清楚到底是什么导致了崩溃——所以我将手势识别器添加到构建对象的循环中,这一切都很好。不是我想怎么做(我试图把它保存在对象的类定义中),而是随便什么。也许这会帮助其他人

谢谢你的回复,塞吉奥。这实际上是我开始的,所以发布的代码是我试图回去清理所有我尝试过的。。。很明显,我没有提到这一点。不管怎样,只是想尝试一下,我把它放回去。。。同样的问题,尽管控制台在点击和崩溃时只报告(lldb)。在异常上放置断点以查看崩溃发生的确切位置。。。或者,您是否已经在Xcode窗口的左侧看到了崩溃后的堆栈跟踪?里面有什么?是的,它在追踪。。。不知道这个屏幕截图是否有很大帮助,但这里是:对self.view的引用正确地添加了阴影,所以这不会是问题所在。.h(标签和一个图像视图)中的所有道具也会正确填充。因此,xib知道文件所有者。这就是为什么我喜欢wtf?为什么在选择器肯定在那里的情况下抛出该错误。看起来您的
视图在某个时候被解除分配,但手势识别器仍然挂在那里。您是否介意执行以下操作:`UITapGestureRecognitizer*singleTap=[[UITapGestureRecognitizer alloc]initWithTarget:自我操作:@selector(singleTap手势:)]autorelease];`这也将消除内存泄漏。你可能还是会撞车,但我希望能早点。谢谢你的回复,塞吉奥。这实际上是我开始的,所以发布的代码是我试图回去清理所有我尝试过的。。。很明显,我没有提到这一点。不管怎样,只是想尝试一下,我把它放回去。。。同样的问题,尽管控制台在点击和崩溃时只报告(lldb)。在异常上放置断点以查看崩溃发生的确切位置。。。或者,您是否已经在Xcode窗口的左侧看到了崩溃后的堆栈跟踪?里面有什么?是的,它在追踪。。。不知道这个屏幕截图是否有很大帮助,但这里是:对self.view的引用正确地添加了阴影,所以这不会是问题所在。.h(标签和一个图像视图)中的所有道具也会正确填充。因此,xib知道文件所有者。这就是为什么我喜欢wtf?为什么在选择器肯定在那里的情况下抛出该错误。看起来您的
视图在某个时候被解除分配,但手势识别器仍然挂在那里。您是否介意执行以下操作:`UITapGestureRecognitizer*singleTap=[[UITapGestureRecognitizer alloc]initWithTarget:自我操作:@selector(singleTap手势:)]autorelease];`这也将消除内存泄漏。你可能仍然会发生崩溃,但我希望会更早。崩溃报告日是什么时候?你的iBouts应该是(非原子的,弱的)崩溃报告日是什么时候?你的iBouts应该是(非原子的,弱的)