无法在Xcode 4上编译Objective-C

时间:2011-03-18 22:18:28

标签: objective-c xcode ios macos xcode4

我已经购买了Xcode 4以开始开发iOS应用程序。我来自C,C ++的背景。 我从这里输入了以下示例: http://en.wikibooks.org/wiki/Objective-C_Programming/syntax 到一个XCode项目(命令行工具 - >基础模板,不是我知道它意味着什么,只是我在某处读到的)。 我命名文件:point.h,point.m,main.m

起初,我有3个错误。通过将类的名称从“Point”更改为“MyClass”,我摆脱了其中的2个 但现在我收到以下警告: 找不到方法'+ new'(返回类型默认为'id') 关于这条线: MyClass *point = [MyClass new]

我在调试器输出部分也没有输出。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

好像你有一些问题......

我会说您忘记继承NSObject,因此找不到方法+new

@interface MyClass : NSObject

@end

答案 1 :(得分:1)

好的,让我们从头开始吧。 Read this

现在,“+ new”很有意义。它告诉您,您要求向CLASS“MyClass”发送消息。这与“MyClass”的实例非常不同。其他语言中的类消息称为“静态方法”或“类方法”。在ObjC中,类方法用+表示,实例方法用-表示。

最常见的类方法是alloc。在ObjC中,您将此消息发送到类以创建新实例并将其返回。为新实例分配内存后,可以向其发送init消息。从那时起,您可以retainrelease。我想你应该已经明白了。大多数消息都是发送给类的实例,而不是类本身。

...所以

MyClass* c = [[MyClass alloc] init];
[c doStuff];
[c release];

首先,我们分配新内存来保存MyClass的对象。然后我们发送一条init消息,以确保所有设置正确。之后,我们向doStuff变量中存储的MyClass初始化实例发送c消息。然后我们通过发送release消息来释放内存。

关于保留/释放的说明。

当我们分配时,保留计数从0到1.当我们发布时,保留计数从1变为0.这类似于其他语言中的一些“智能指针”。保留计数达到0后,将取消分配对象。因此,当在此处发送释放消息时,您应该能够在MyClass dealloc块(实例方法)中设置断点。请记住,当你指定init或dealloc块时,总是将消息发送到super,以便你得到适当的清理。

编辑:

是的,我认为你应该继承NSObject,因为@macmade说。你可以从这个基类获得各种非常有用的东西,比如new,alloc,init,release,retain,autorelease等。原因是你的实例将生活在堆上,而不是堆栈。在像Java或C#这样的语言中,您可以透明地获得这种统一类型系统。由于这是ObjC,您需要选择加入它。

如果您希望像结构一样管理您的Point(看一下内置的CGPoint),您也可以这样做,但在这种情况下,您需要以非常不同的方式管理它。它将是堆栈内存,而不是堆内存。您可以通过查看CGPoint或CGRect等内容来获得差异的好例子。实际上,Apple的The Objective-C Programming Language中已经清楚地记录了所有这些内容。