首页 文章

如何解决'unrecognized selector sent to instance'?

提问于
浏览
35

在AppDelegate中,我正在分配静态库中定义的实例 . 此实例的NSString属性设置为“copy” . 当我访问此实例上的字符串属性时,应用程序崩溃,“无法识别的选择器发送到实例” . Xcode为属性提供代码提示,这意味着它在调用应用程序中是已知的 . 特定类被编译到静态库目标中 . 我错过了什么?

添加一些代码 .

//static library 
//ClassA.h
@interface ClassA : NSObject {
...
NSString *downloadUrl;
}
@property(nonatomic, copy) NSString *downloadUrl;

//ClassA.m
@synthesize downloadUrl;

在调用应用程序的appDelegate中 .

//app delegate header file
@interface myApp : NSObject <UIApplicationDelegate> {
ClassA *classA;
}
@property (nonatomic, retain) ClassA *classA;

//app delegate .m file
@synthesize classA;

- (void)applicationDidFinishLaunching:(UIApplication *)application {
classA = [[ClassA alloc] init];
//exception occurs here.  downloadUrl is of type NSCFNumber
classA.downloadUrl = @"http://www.abc.com/";
...}

应用程序中的其他类将获得对委托的引用并调用classA.downloadUrl .

9 回答

  • 1

    1)在 @implementation 块内合成?

    2)你应该参考 self.classA = [[ClassA alloc] init];self.classA.downloadUrl = @"..." 而不是普通 classA 吗?

    3)在您的 myApp.m 文件中,您需要导入 ClassA.h ,当它丢失时,它将默认为数字或指针? (如果编译器找不到,C变量默认为int):

    #import "ClassA.h" .

  • 0

    在项目设置中的其他链接器标志中设置标志 -ObjC ...(不在静态库项目中,而是使用静态库的项目...)并确保在项目设置配置中设置为 All Configuration

  • 14

    很多人已经为这个和类似的问题提供了一些非常技术性的答案,但我认为它比这更简单 . 有时,如果您没有注意,您不打算使用的选择器可以附加到界面中的某些内容 . 您可能会收到此错误,因为选择器在那里但您没有为其编写任何代码 .

    仔细检查不是这种情况的最简单方法是按住Ctrl键单击该项,以便可以看到与其关联的所有选择器 . 如果那里有你不想要的任何东西,那就摆脱它吧!希望这可以帮助...

  • 1

    在您发布的代码中,您将 setDownloadURL: setter发送到 ClassA - 即类本身 . 您想要设置实例的属性 .

  • 18

    如何将ClassA导入AppDelegate类?您是否在主项目中包含.h文件?我有一段时间没有这个问题,因为我没有将头文件复制到主项目以及正常的#include“ClassA.h” .

    复制或创建.h为我解决了它 .

  • 1

    对我来说,造成这个错误的原因是我不小心将同一条消息两次发送给同一个 class 成员 . 当我右键单击gui中的按钮时,我可以看到方法名称两次,我只删了一个 . 在我的情况下肯定是新手的错误,但是想要让其他新手考虑一下 .

  • 25

    我的事情很简单/愚蠢 . 对于任何已将NSManagedObject转换为普通NSObject的人来说,新手都是错误的 .

    我有:

    @dynamic order_id;
    

    当我应该有:

    @synthesize order_id;
    
  • 1

    您应该注意,这不一定是最好的设计模式 . 从它的外观来看,您实际上是在使用App Delegate来存储全局变量的数量 .

    Matt Gallagher在http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html的Cocoa with Love文章中很好地讨论了全局问题 . 在所有可能的情况下,你的ClassA应该是AppDelegate中的单例而不是全局,尽管你可能认为ClassA更通用而不仅仅是单例 . 在这种情况下,您可能最好使用类方法返回A类的预配置实例,例如:

    + (ClassA*) applicationClassA
    {
        static ClassA* appClassA = nil;
        if ( !appClassA ) {
            appClassA = [[ClassA alloc] init];
            appClassA.downloadURL = @"http://www.abc.com/";
        }
        return appClassA;
    }
    

    或者(因为那会将特定于应用程序的东西添加到可能是通用类的东西中),创建一个新类,其唯一目的是包含该类方法 .

    关键是应用程序全局变量不需要成为AppDelegate的一部分 . 仅仅因为AppDelegate是一个已知的单例,并不意味着所有其他应用程序全局都应该与它混合在一起,即使它们在处理NSApplication委托方法时没有任何概念上 .

  • 0

    非常奇怪,但是 . 您必须将应用程序实例的类声明为myApplication:UIApplication而不是myApplication:NSObject . 似乎UIApplicationDelegate协议没有实现registerForSystemEvents消息 . 又疯狂的Apple API .

相关问题