如何解决'无法识别的选择器发送到实例'?

4th*_*ace 36 iphone cocoa-touch memory-management objective-c static-libraries

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

添加一些代码.

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

//ClassA.m
@synthesize downloadUrl;
Run Code Online (Sandbox Code Playgroud)

在调用应用程序的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/";
...}
Run Code Online (Sandbox Code Playgroud)

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

ste*_*anB 26

1)@implementation块内合成?

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

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

#import "ClassA.h".

  • 最后我解决了.我从库中的.h文件中删除了ClassA.h,该文件引用了所有.h文件.然后我将ClassA.h拖到app项目中并添加了导入.我试图遵循这里提到的技术github.com/joehewitt/three20/tree/master和他的common.h.奇怪的是我仍然有很多通过我的common.h引用的类,它仍然在app项目中工作.我没有拖动他们的头文件 (3认同)

Mih*_*hta 19

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


Dav*_*ter 15

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

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