Objective-C 和 C++ 很像,都是在 C 的基础上对其进行扩展。Objective-C 扩展后,更象一门动态语言。
我们来看看 Objective-C 的中 class 如何来表达。
obj-c 中的 #import 相当于自动为你写了 #ifndef / #define / #endif,当然,#include 也依旧可以用。
---------------- HelloWorld.h ---------------
#import <Foundation/Foundation.h>
@interface HelloWorld : NSObject {
int value; // 括号之间放 data members
}
- (void) setValue: (int) v; // - 表示 instance member function
- (int) getValue;
+ (const char *) helloString; // + 表示 class static function
@end
--------------- HelloWorld.m ----------------
#import "HelloWorld.h"
@implementation HelloWorld
- (void) setValue:(int)v
{
value = v;
}
- (int) getValue
{
return value;
}
+ (const char *) helloString
{
return "Hello Objective-C!";
}
@end
----------------- main.m -------------------
#import "HelloWorld.h"
int main (int argc, const char * argv[]) {
HelloWorld *p = [[HelloWorld alloc] init];
[p setValue:10];
printf("v = %d, %s\n", [p getValue], [HelloWorld helloString]);
[p release];
return 0;
}
--------------------------------------------
和 java 一样,object instance 只能从 heap 上申请,不能放到 stack。
obj-c 2.0 之前没有 gc,通过继承自 NSObject 实现 reference count 的功能。
obj = [[Class alloc] init];
use obj ...
[obj retain]; // add ref
[obj release]; // release ref
[[Class alloc] init] 显式地将内存申请和初始化内存两步分开,可能写起来有点ugly,但让读代码的人清晰明了,偶稀饭。
[obj func] 这样的函数调用形式,除了写法上与 C++/Java 不同外,obj-c 中相当于给 obj 发送一个名为 func 的 message。就是说函数不是 compile time 静态绑定的,而是与动态语言类似。
obj-c 中 nil 代表 pointer points no object。C++ 中我们常写
if (obj) {
obj->doSomeThing();
}
而 obj-c 中 [obj doSomeThing],如果 obj == nil,不会出错,程序继续执行。
ps. 经常说的 Xcode 其实就是 mac 下的 Visual Studio,很好用,语法加亮 copy 到 blog 还可以生效,cooool~
而 cocoa 就是 Foundation + AppKit(UIKit) 的合称。
评论