在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。
答案 0 :(得分:26)
1)是否在@implementation
块内合成?
2)您是否应该引用self.classA = [[ClassA alloc] init];
和self.classA.downloadUrl = @"..."
而不是简单的classA
?
3)在您的myApp.m
文件中,您需要导入ClassA.h
,当它丢失时,它将默认为数字或指针? (如果编译器找不到,C变量默认为int):
#import "ClassA.h"
。
答案 1 :(得分:18)
在项目设置中的其他链接器标志中设置标志 -ObjC ...(不在静态库项目中,而是使用静态库的项目...)并确保在项目设置配置设置为所有配置
答案 2 :(得分:15)
很多人已经为这个和类似的问题提供了一些非常技术性的答案,但我认为它比这更简单。有时,如果您没有注意,您不打算使用的选择器可以附加到界面中的某些内容。您可能会收到此错误,因为选择器在那里但您没有为其编写任何代码。
仔细检查不是这种情况的最简单方法是按住Ctrl键单击该项,以便查看与其关联的所有选择器。如果那里有你不想要的任何东西,那就摆脱它吧!希望这会有所帮助...
答案 3 :(得分:1)
在您发布的代码中,您将setDownloadURL:
二传手发送给ClassA
- 也就是类本身。您想要设置实例的属性。
答案 4 :(得分:1)
如何将ClassA导入AppDelegate类?您是否在主项目中包含.h文件?我有一段时间没有这个问题,因为我没有将头文件复制到主项目以及正常的#include“ClassA.h”。
复制或创建.h为我解决了。
答案 5 :(得分:1)
对我来说,造成这个错误的原因是我不小心将同一条消息两次发送给同一个班级成员。当我右键单击gui中的按钮时,我可以看到方法名称两次,我只删了一个。在我的情况下肯定是新手的错误,但是想要让其他新手考虑一下。
答案 6 :(得分:1)
我有:
@dynamic order_id;
当我应该有:
@synthesize order_id;
答案 7 :(得分:0)
您应该注意,这不一定是最好的设计模式。从它的外观来看,您实际上是在使用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委托方法时没有任何概念上。
答案 8 :(得分:0)
非常奇怪,但是。您必须将应用程序实例的类声明为myApplication:UIApplication而不是myApplication:NSObject。似乎UIApplicationDelegate协议没有实现+ registerForSystemEvents消息。疯狂的Apple API,再次。