38

在 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。

4

9 回答 9

27

1) 合成是否在@implementation块内?

2)您应该参考self.classA = [[ClassA alloc] init];andself.classA.downloadUrl = @"..."而不是 plain classA

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

#import "ClassA.h".

于 2009-05-14T06:14:37.283 回答
20

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

于 2010-07-23T08:45:46.547 回答
15

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

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

于 2012-05-07T17:49:52.860 回答
1

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

于 2009-05-14T05:03:25.690 回答
1

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

复制或创建 .h 为我解决了这个问题。

于 2009-05-14T05:53:55.553 回答
1

对我来说,导致这个错误的原因是我不小心将相同的消息发送给同一个班级成员两次。当我右键单击 gui 中的按钮时,我可以看到两次方法名称,我只是删除了一个。在我的情况下肯定是新手错误,但想把它拿出来供其他新手考虑。

于 2012-06-19T02:02:07.563 回答
1

我的东西很简单/愚蠢。新手错误,对于将 NSManagedObject 转换为普通 NSObject 的任何人。

我有:

@dynamic order_id;

当我应该有的时候:

@synthesize order_id;
于 2012-08-19T04:59:33.017 回答
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 委托方法无关。

于 2009-06-08T03:35:30.790 回答
0

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

于 2010-12-05T22:13:53.357 回答