在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)在
@implementation
块内合成?2)你应该参考
self.classA = [[ClassA alloc] init];
和self.classA.downloadUrl = @"..."
而不是普通classA
吗?3)在您的
myApp.m
文件中,您需要导入ClassA.h
,当它丢失时,它将默认为数字或指针? (如果编译器找不到,C变量默认为int):#import "ClassA.h"
.在项目设置中的其他链接器标志中设置标志 -ObjC ...(不在静态库项目中,而是使用静态库的项目...)并确保在项目设置配置中设置为 All Configuration
很多人已经为这个和类似的问题提供了一些非常技术性的答案,但我认为它比这更简单 . 有时,如果您没有注意,您不打算使用的选择器可以附加到界面中的某些内容 . 您可能会收到此错误,因为选择器在那里但您没有为其编写任何代码 .
仔细检查不是这种情况的最简单方法是按住Ctrl键单击该项,以便可以看到与其关联的所有选择器 . 如果那里有你不想要的任何东西,那就摆脱它吧!希望这可以帮助...
在您发布的代码中,您将
setDownloadURL:
setter发送到ClassA
- 即类本身 . 您想要设置实例的属性 .如何将ClassA导入AppDelegate类?您是否在主项目中包含.h文件?我有一段时间没有这个问题,因为我没有将头文件复制到主项目以及正常的#include“ClassA.h” .
复制或创建.h为我解决了它 .
对我来说,造成这个错误的原因是我不小心将同一条消息两次发送给同一个 class 成员 . 当我右键单击gui中的按钮时,我可以看到方法名称两次,我只删了一个 . 在我的情况下肯定是新手的错误,但是想要让其他新手考虑一下 .
我的事情很简单/愚蠢 . 对于任何已将NSManagedObject转换为普通NSObject的人来说,新手都是错误的 .
我有:
当我应该有:
您应该注意,这不一定是最好的设计模式 . 从它的外观来看,您实际上是在使用App Delegate来存储全局变量的数量 .
Matt Gallagher在http://cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html的Cocoa with Love文章中很好地讨论了全局问题 . 在所有可能的情况下,你的ClassA应该是AppDelegate中的单例而不是全局,尽管你可能认为ClassA更通用而不仅仅是单例 . 在这种情况下,您可能最好使用类方法返回A类的预配置实例,例如:
或者(因为那会将特定于应用程序的东西添加到可能是通用类的东西中),创建一个新类,其唯一目的是包含该类方法 .
关键是应用程序全局变量不需要成为AppDelegate的一部分 . 仅仅因为AppDelegate是一个已知的单例,并不意味着所有其他应用程序全局都应该与它混合在一起,即使它们在处理NSApplication委托方法时没有任何概念上 .
非常奇怪,但是 . 您必须将应用程序实例的类声明为myApplication:UIApplication而不是myApplication:NSObject . 似乎UIApplicationDelegate协议没有实现registerForSystemEvents消息 . 又疯狂的Apple API .