好吧,让我们从头开始。 Read this。
现在,“+新”是有意义的。它告诉你,你要求发送消息给CLASS“MyClass”。这与“MyClass”的实例非常不同。其他语言中的类消息被称为“静态方法”或“类方法”。在ObjC中,类方法用+
表示,实例方法用-
表示。
最常见的分类方法是alloc
。在ObjC中,您将此消息发送给该类以创建一个新实例并将其返回。一旦为新实例分配了内存,就可以发送init
消息给它。从此,你可以retain
或release
它。我想你应该已经明白了。大多数消息旨在被发送到类的实例,而不是类本身。
所以....
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中都有很清楚的记载。
来源
2011-03-18 22:40:04
slf
发布您的一些代码。例如,发布MyClass的头文件。它是NSObject的一个子类吗? – 2011-03-18 22:22:15
如果程序无法编译,您将无法在调试器中获得任何输出。调试器只能用于正在运行的应用程序。 – dreamlax 2011-03-18 23:00:01