应用程序崩溃,无法识别的选择器发送到实例 - 可能是骗局
Posted
技术标签:
【中文标题】应用程序崩溃,无法识别的选择器发送到实例 - 可能是骗局【英文标题】:App crashes with unrecognized selector sent to instance - possible dupe 【发布时间】:2015-02-27 21:41:43 【问题描述】:我知道有人问过这个问题,但我看到的答案都没有帮助我。如果您认为我错过了可能有帮助的内容,请告诉我。我看到了其他示例,其中视图控制器根本没有尝试设置的变量,但这不是我的情况。
我在转场期间收到此错误:
-[EditPropertyViewController setLawnNumber:]: unrecognized selector sent to instance 0x19a301e0
每当我在 prepareForSegue 中点击这个 if 块时:
if( [segue.identifier isEqual:@"editProperty"])
EditPropertyViewController *destView = segue.destinationViewController;
destView.lawnNumber = _lawnNumber;
destView.latitude = _latitude;
destView.longitude = _longitude;
destView.address = _serviceAddressLabel.text;
我的 .m 文件顶部确实有 #import "EditPropertyViewController.h"。我确实有一个标识符为“editProperty”的segue,它推动了一个设置为类型EditPropertyViewController的视图控件。
这里是 EditPropertyViewController.h,表明我有我要设置的变量:
#import <UIKit/UIKit.h>
#import <GoogleMaps/GoogleMaps.h>
@interface EditPropertyViewController : UIViewController
@property (nonatomic, strong) GMSMapView *mapView;
@property (nonatomic, strong) GMSCameraPosition *camera;
@property(strong, nonatomic) NSString *address;
@property (nonatomic) CLLocationDegrees latitude;
@property (nonatomic) CLLocationDegrees longitude;
@property (nonatomic) int lawnNumber;
@end
我使用相同的方法和相同的变量类型以及在其他 segues 期间不传递数据的方法,但我看不出我在这里做了什么不同的事情来导致这个问题。我还没有在其他任何地方创建 [customVC setVariable:] 方法,也没有遇到这个问题。
感谢任何建议!
编辑 - 按照@David H 的建议,我在尝试设置值之前添加了这两行:
NSLog(@"Actual class is %@", NSStringFromClass([destView class]));
assert( [destView class] == NSStringFromClass([destView class]));
导致以下输出:
2015-02-27 16:56:27.623 LawnGuru[2730:460942] Actual class is EditPropertyViewController
Assertion failed: ([destView class] == NSStringFromClass([destView class]))
从情节提要中复制/粘贴,这是我试图转到的 VC 类型:“EditPropertyViewController”,这是我正在访问的 .h 文件:#import “EditPropertyViewController.h”
【问题讨论】:
您是否在 EditPropertyViewController.m 中使用 @synthesize 来表示草坪数字属性?如果有,请出示。 我不是。我在整个项目中都没有使用过@synthesize。事实上,我在 EditPropertyViewController.m 上唯一更改的是添加 (IBAction)prepareForUnwindEditProperty:(UIStoryboardSegue *)segue,它是空的,因此我可以在未来的视图控制器上点击展开以返回它。没有其他任何东西被触及。 @JakeT.: 直接打开头文件查看属性是否存在(我的意思是按定义跳转不打开) XCode 会崩溃吗?我很难理解您是如何看到 lldb 错误消息的,除非是您的程序崩溃了。 您可以尝试删除editPropertyViewController 中的lawnNumber 属性,然后重新制作它,以确保Xcode 中不会发生一些奇怪的事情。我看不出你的代码有什么问题。 【参考方案1】:有时,从我在其他问题中看到的情况来看,Xcode 似乎出现了问题,解决这种情况的唯一方法是删除涉嫌违规的代码并重新添加它。尝试删除 lambNumber 属性,然后重新执行。
【讨论】:
即使我在首先设置的任何属性上都遇到了错误,但仅重写草坪数字就可以解决整个问题。谢谢!【参考方案2】:几乎可以肯定你的dest
视图控制器不是你想象的那样。试试这个:
EditPropertyViewController *destView = segue.destinationViewController;
NSLog(@"Actual class is %@", NSStringFromClass([destView class]));
if ( [destView class] == [EditPropertyViewController class] )
NSLog(@"Class is good, responds to selector=%d", [destView respondsToSelector:@selector(setLawnNumber:)] );
【讨论】:
在我尝试设置值之前添加底部两行,我得到这个输出:2015-02-27 16:56:27.623 LawnGuru[2730:460942] 实际类是 EditPropertyViewController Assertion failed: ([ destView 类] == NSStringFromClass([destView 类]))。我会用这些信息更新我的问题。从情节提要中复制/粘贴,这是我试图转到的 VC 类型:“EditPropertyViewController”,这是我正在访问的 .h 文件:#import "EditPropertyViewController.h" 那个断言没有意义。类对象指针永远不会等于字符串指针。 assert() 不正确 - 我更改了那段代码。现在重试 - 看看响应选择器是否说了什么。 @HotLicks 是的 - 尝试在这些答案中输入代码更加困难,因为 SO 更改了编辑器...对 respondsToSelector 的测试将使用较旧的 .o 而不定义该属性来获取 Xcode 错误。 @DavidH if 语句通过了 true。其他人在评论中建议删除属性并重写它们。我曾尝试重新排列在源 VC 中设置属性的顺序,以查看它是该属性还是目标 VC 有问题,并且任何顺序都会在我尝试设置的第一个属性处引发错误。我只删除了 glassNumber 属性并将其重写为完全相同(据我所知),整个 segue 都起作用了。知道为什么重写一个属性会修复所有这些吗? 可能该类没有正确编译。 Xcode 做了很多缓存。您将获得“对选择器的响应”成功,但在实际调用它时却失败了,这令人费解。通常,当奇怪的事情发生时,最好的办法是删除派生文件夹并从头开始构建。我很少觉得这是必要的,但有时它当然是必要的。这里失败的正常原因就像我说的那样——控制器的类不是你想象的那样! Swift 将帮助人们更早地发现这类问题。以上是关于应用程序崩溃,无法识别的选择器发送到实例 - 可能是骗局的主要内容,如果未能解决你的问题,请参考以下文章
应用程序随机崩溃,NSInvalidArgumentException 无法识别的选择器发送到实例 0x800000000000000
iPhone 应用程序崩溃 [__NSCFString objectForKey:] 无法识别的选择器发送到实例