我已经购买了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]
我在调试器输出部分也没有输出。
任何想法如何解决这个问题?
答案 0 :(得分:2)
好像你有一些问题......
我会说您忘记继承NSObject
,因此找不到方法+new
。
@interface MyClass : NSObject
@end
答案 1 :(得分:1)
好的,让我们从头开始吧。 Read this
现在,“+ new”很有意义。它告诉您,您要求向CLASS“MyClass”发送消息。这与“MyClass”的实例非常不同。其他语言中的类消息称为“静态方法”或“类方法”。在ObjC中,类方法用+
表示,实例方法用-
表示。
最常见的类方法是alloc
。在ObjC中,您将此消息发送到类以创建新实例并将其返回。为新实例分配内存后,可以向其发送init
消息。从那时起,您可以retain
或release
。我想你应该已经明白了。大多数消息都是发送给类的实例,而不是类本身。
...所以
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中已经清楚地记录了所有这些内容。