如何解决“无法识别的选择器发送到实例”?
-
21-08-2019 - |
题
在 AppDelegate 中,我分配静态库中定义的实例。这个实例有一个 NSString 属性设置了一个“副本”。当我访问此实例上的字符串属性时,应用程序崩溃并显示“无法识别的选择器发送到实例”。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。
解决方案
1) 是否综合在 @implementation
堵塞?
2)您是否应该参考 self.classA = [[ClassA alloc] init];
和 self.classA.downloadUrl = @"..."
而不是普通的 classA
?
3)在你的 myApp.m
您需要导入的文件 ClassA.h
, ,当它丢失时,它将默认为数字或指针?(在 C 变量中,如果编译器未找到,则默认为 int):
#import "ClassA.h"
.
其他提示
设置标志的 -ObjC 在您的项目设置的其他链接器标志......(而不是在静态库项目,但这个项目你正在使用静态库...),并确保在项目设置的配置设置为所有配置强>
这是很多人都给出了类似这种问题,一些非常技术性的答案,但我认为这是简单得多。有时候,如果你不注意,你不打算使用可以连接到在界面的东西选择。你可能会得到这个错误,因为选择的存在,但你还没有编写任何代码它。
以最简单的方式仔细检查,这是不是这种情况是控制单击该项目,所以你可以看到所有与此相关的选择的。如果有中有什么,你不想要的,干掉它!希望这有助于...
在您发布的代码,你要发送的setDownloadURL:
二传手到ClassA
- 也就是类本身的。要设置实例的属性。
你是如何导入ClassA的进入你的AppDelegate类?是否包含在主项目.h文件?我有这个问题了一段时间,因为我没有头文件复制到主项目以及正常的#include“ClassA.h。”
复制,或创建的.h解决对我来说。
对于我来说,是什么原因导致这个错误是我不小心有发送相同的消息两次到同一类成员。当我在GUI按钮右侧点击,我能看到的方法名称两次,我只是删除一个。新手的错误在我的情况是肯定的,但要得到它在那里为其他新手的考虑。
矿是一件简单/笨。新手错误,对于任何已转换其NSManagedObject到正常NSObject的。
我有:
@dynamic order_id;
当我应该有:
@synthesize order_id;
您应该注意这不一定是最好的设计模式。从外观上来看,你基本上是使用应用程序委托存储相当于一个全局变量。
马特·加拉格尔覆盖全局的问题,以及在他与的 http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html 。在所有的情形产生,你的ClassA的应该是一个单身,而不是在AppDelegate的一个全球性的,但它可能是您的意图ClassA的更通用的,而不是简单单身。在这种情况下,你可能会与一个类方法最好以返回一类的预先配置的情况下,是这样的:
+ (ClassA*) applicationClassA
{
static ClassA* appClassA = nil;
if ( !appClassA ) {
appClassA = [[ClassA alloc] init];
appClassA.downloadURL = @"http://www.abc.com/";
}
return appClassA;
}
或可替换地(因为这会增加应用具体的东西,什么是可能的通用类),创建新的类,其唯一目的是包含类方法。
的一点是,应用全局不需要是AppDelegate中的一部分。仅仅因为AppDelegate的是一个已知的单,并不意味着全球所有其他应用程序应与它混合,即使她们没什么概念做处理的NSApplication委托方法。
非常奇怪,但。您必须声明你的应用程序实例为MyApplication类:UIApplication的,而不是为MyApplication的:NSObject的。看来,UIApplicationDelegate协议没有实现+ registerForSystemEvents消息。疯狂的苹果的API,试。