由于之前的工作内容主要是Windows开发,常年与C++相伴,最近因项目需要,开始接触iOS开发.
iOS虽然可以支持C/C++,但是CocoaTouch提供的都是基于ObjectiveC的接口,因此ObjectiveC是开发iOS应用的必备语言.
相信有过C++开发基础的人,学习ObjectiveC并不是难事,毕竟OC也是面向对象的开发语言,这里就不讲类似于HelloWorld这样的示例了.我从我自己在语法学习中碰到的些问题与C++做了些对比,对于掌握语法还是有些帮助的.
1. 变量声明:
OC中的变量声明和C++类似,也分基础类型和对象类型,基础类型和C++一样;对象类型OC里全部是指针类型,不像C++里还有指针,引用,实例等多个概念.
2.函数声明:
OC里使用的是中括号来表示函数的调用,例如[a b] 等价于C++中的a.b();表示调用类对象a的方法b.有参数的则是[a b:param1].
有意思的是,OC中使用了参数描述的限定符(这个名称是我猜的)来增加多参数函数语句的可读性. 例如比较函数min, 在OC里的定义可以是 +(int) min:(int)num1 compareto:(int)num2 ; 这里的compareto就是一个描述符,在函数调用的时候必须加上,如: int c = [class min:a1 compareto:a2];
另外OC里用函数前面的+ -符号来表示函数是静态函数还是成员函数.
3.类别Category:
@interface MyAppDelegate (MyCategory) <TestProtocol>
这里的(MyCategory)括号里的表示扩展某个类(Category),区别于继承,相当于给某个类增加一些属性和方法。
(1)类别只能添加新方法,无法添加新的实例变量
(2)如果类别名和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
后面的尖括号标示实现某个协议(protocol),可以看成是C++中的需继承,表示类必须实现TestProtocol协议的所定义的方法。
4.类的定义:
@interface MyAppDelegate (MyCategory) <TestProtocol>
@property (strong, nonatomic) UIWindow *window;
@property (nonatomic, strong) MyChatTabBarController *tabBarController;
@end
@property (strong, nonatomic) UIWindow *window;这句表示定一个一个类的属性,是强引用,nonatomic表示不是线程安全的,性能稍好于线程安全的定义(atomic). 这样的定义的好处是代码比较简洁:这一行代码相当于在头文件里的代码:
{
UIWindow * _window;
}
- (UIWindow *) window;
- (void)setWindow:(UIWindow *) val;
property 可以定义在.h中表示是公有的,如果在m文件中则外面不能访问。
@synthesize window=__window;
这个语句也是常用的写法,表示在类中声明了一个成员变量__window,当访问window这个属性的时候实际上是对__window的操作;等同于省略了下列代码:
- (UIWindow *) window{
return __window;
}
- (void)setWindow:(UIWindow *) val{
__window = val;
}
5. 类的初始化
ClassA *a = [[ClassA alloc] init ];通用写法,init函数可以替换成其他的初始化函数,也可以自己实现。
6.self 关键字
这个很好理解,相当于C++里的this指针,但是由于OC里大量使用了property,因此在对于property定义的成员(例如memberA)时member = value 和self.memberA = value;的意义是有差别,前一个仅仅是变量的复制,后一个则是调用了类的setter和getter函数,特别是对于NSOb
ject的属性的时候,后一种方法能有效的控制引用计数,防止内存泄漏。除非有特别的用途,一般property定义的成员变量建议加上self限定符进行使用。
7.id 关键字
这个类似于C++中的auto,但是这个关键字可以用来修饰在函数的参数和返回值。
8. NS开头
NS开头的一般都是系统库里的对象,都是有引用计数机制的,在定义属性的时候需要加上retain
NSString 是Cocoa里的基础字符串类。初始化 @"hello world";
NSLog 输出到debug窗口,基础类型和C++一样"%d",如果是继承自NSObject 需要格式化成"%@"
9.BOOL 类型
这个类型用的时候需要小心, 因为是个数字型,而且系统定义了两个宏 YES和NO, 尽量不要将数字的返回值去和YES作比较, YES是个固定的非零值。
私以为掌握这些的C++开发者就基本上能看懂iOS的代码了,当然还有一些特殊的宏需要慢慢的积累和学习才能了解.
欢迎大家补充.