我目前正从C迁移到Objective-C,对我来说,这段代码似乎都是花花公子,但Xcode认为不然。我从互联网上获得了这个代码示例,并且一直在不断尝试纠正它,我来到了一个deadend:
#include <objc/Object.h>
@interface Greeter:Object
{
/* This is left empty on purpose:
** Normally instance variables would be declared here,
** but these are not used in our example.
*/
}
- (void)greet;
@end
#include <stdio.h>
@implementation Greeter
- (void)greet
{
printf("Hello, World!\n");
}
@end
#include <stdlib.h>
int main(void)
{
id myGreeter;
myGreeter = [Greeter new];
[myGreeter greet];
[myGreeter release];
return 0;
}
错误似乎在myGreeter = [Greeter new];
行,Xcode将问题隔离为Thread 1.我需要分配/ init吗?
以下是控制台日志:
[Switching to process 1833 thread 0x0]
2011-04-18 21:52:10.323 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement methodSignatureForSelector: -- trouble ahead
2011-04-18 21:52:10.326 PROJ[1833:903] *** NSInvocation: warning: object 0x100001160 of class 'Greeter' does not implement doesNotRecognizeSelector: -- abort
sharedlibrary apply-load-rules all
Current language: auto; currently objective-c
(gdb)
答案 0 :(得分:3)
您的班级Greeter
继承自Objective-C Object
班级。在Cocoa中,根类(通常)是NSObject
,你应该继承它。这可能会解决您的问题。
答案 1 :(得分:2)
Greeter:Object
应为Greeter:NSObject
,“对象”不是Objective-c类。
答案 2 :(得分:0)
这不仅仅是Xcode调试器停止在“main”中的默认断点吗?只需单击“继续”(或“运行”菜单中的类似内容),您就应该是金色的。
答案 3 :(得分:0)
您的示例使用GNU运行时,因此有点弃用。编译器默认为NeXT运行时,但可以设置为使用GNU运行时和编译选项-fgnu-runtime
你应该研究一下关于Objective-C的好书,比如Stephen Kochan编写的“Objective-C编程”
http://www.amazon.com/Programming-Objective-C-Stephen-Kochan/dp/0672325861
答案 4 :(得分:0)
也许我错了,但我一直认为你在Objective-C中分配了这样的
id myGreeter;
myGreeter= [[myGreeter alloc] init];
答案 5 :(得分:0)
实际上,对于alloc / init,使用new是一种简写,你可以阅读here
然而,你在Cocoa之外使用objective-c,因为你继承自Object而不是NSObject等等。所以我认为你应该明确地使用myGreeter = [[myGreeter alloc] init];
此外,既然你说Xcode,你应该使用Cocoa。尝试:
#import <Cocoa/Cocoa.h>
然后还将Object切换到NSObject