2011-03-18 81 views
0

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

起初,我得到了3个错误。我通过将课程名称从“Point”更改为“MyClass” ,但现在我得到以下警告: 找不到方法'+ new'(返回类型默认为'id') 关于该行: MyClass *point = [MyClass new]

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

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

+0

发布您的一些代码。例如,发布MyClass的头文件。它是NSObject的一个子类吗? – 2011-03-18 22:22:15

+0

如果程序无法编译,您将无法在调试器中获得任何输出。调试器只能用于正在运行的应用程序。 – dreamlax 2011-03-18 23:00:01

回答

2

好像你有一些问题...

我会说你忘了从NSObject继承,因此该方法+new找不到。

@interface MyClass : NSObject 

@end 
1

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

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

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

所以....

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

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

关于保留/释放的注意事项。

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

编辑:

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

如果你宁愿管理你的Point像一个结构(看看内置的CGPoint),你也可以这样做,但在这种情况下,你需要对它进行非常不同的管理。这将是堆栈内存,而不是堆内存。您可以通过查看诸如CGPoint或CGRect之类的源代码来获得差异的一个很好的例子。实际上,所有这些东西在Apple的The Objective-C Programming Language中都有很清楚的记载。

+2

调用类方法'new'与'alloc'和'init'非常相似...如果'new'方法没有找到,'alloc'不会是... – Macmade 2011-03-18 22:44:46

+1

不应该是'MyClass * C'? – detunized 2011-03-18 22:49:50

+0

是的......静态分配在ObjC中并不真正支持,即使他们有一些方法可以做到这一点:P – Macmade 2011-03-18 22:52:25