Objective-C学习总结

和Java丰富的教程资源不同,OC的教程相比起来就少得多了,而且很多就是E文的。所以虽然通常看视频上手快些,但实际上对于OC来说,买本书是个不错的选择。看了网上的评价,选择了《Object-C程序设计(第4版)》,现在第六版已经出版了,但是为毛第四版还涨价了 -_-|||

Hello World

有个段子:

说有个程序员为了陶冶情操,提升生活品质,想在闲暇时间学习书法。一天,他把宣纸铺好,拿起笔,迟疑了几秒,慎重地在纸上写下了“Hello Wrold”。
每个程序员对Hello World都不会觉得陌生。OC也从这里开始:

#import ;

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSLog(@"Hello, World!");
    }
    return 0;
}
OC是在C的基础上发展起来的,所以和C很想,这段Helloworld中,除了@autoreleasepool和NSLog这两个词没见过,剩下的都很容易懂。需要注意的是OC里的字符串是做了封装了的,字符串常量使用@"..."来表示。 NSLog();暂时理解为另一个版本的printf吧,字符串也是支持转义字符和格式字符的,书上写的是“NSLog字符”,就是"%i"这些。OC里面有个"%g"以前没见过,用来表示浮点数,大概含义就是去掉浮点数结尾多余的零,表示大数时使用科学计数法。 算数运算符和表达式和C都是一样一样的,就不多记录了,其实这些东西在每个语言里都差不多…… ### **程序结构语法** 这里的逻辑控制指循环、选择等结构。这部分的语法和C也是一样,没有太多新的东西,我看书的时候也是大概看了看就翻过了,里面的实例代码也是打印三角形、最大公约数、质数这些经典例题。 有一点要说一下,程序员的大括号问题……之前写C语言,包括写C51的时候,会习惯性的将大括号放到下面,也就是左右大括号缩进相同。写Java的时候,会自觉地将大括号放到右侧,这也是Eclipse自动格式的功劳,因为即便写到下面了,自动格式之后还是会挪上去。但是到OC这里,世界就变了……教程里面也是有的在右面,有的在下面:函数的大括号都是下面,if、for等代码块的大括号都是右面!略有处女座情结的博主犯难了,暂时我将所有的都按照C的放到下面了,但是有的时候还是会习惯性地放到右面,什么时候Xcode能解救我呢…… 还有一点是BOOL类型,OC有BOOL类型的封装,包含YES和NO两个值,可以用在布尔表达式中,但是,但是,和Java里不同的是,BOOL是不能打印的(其实可以理解,就是1和0嘛),所以打印的时候还要用下面的写法:
BOOL flag = NO;
NSLog(@"%@", flag ? @"True" : @"False");
字符串的占位符是"%@"。 ### **面向对象** 这也是OC的核心思想,因为Java用了很久了,所以面向对象也没有太大的成本,应该只是有些细节不太一样。 首先就是接口和实现的强制分离,因为我写的不多,所以看不出有什么特别的好处,但是对代码的结构,还是有益的,至少结构清晰了不是么。接口就是给使用者看的,实现就是要隐藏的,只要开发者知道并编辑就好了。@interface部分定义类的信息、公开的方法等,@implementation部分就是方法的实现。 涉及到继承,在@interface中声明的字段在子类中可以访问,但是在@implementation中声明的字段,子类就访问不到了。 相比于Java是使用Eclipse生成getter和setter,OC是通过语言内置的机制实现了getter和setter,这也是OC比Java更符合面向对象思想的一个证据吧。要自动生成getter和setter,在@interface部分使用@property关键字声明类的属性,在@implementation部分使用@synthesize关键字声明相同的属性。 OC里类的语法也是不一样的:
- (void) setNumber: (int) n andCount: (int) count;
  • 首先是方法类型,用来表示是实例方法还是类方法,相当于Java里的static关键字。
  • 紧跟着的是括号括起来的返回值,OC里面函数相关的类型的表示,都是加圆括号的,返回值和参数都是这样。
  • 后面是函数名
  • 最后是参数列表。OC里面每个参数前面都要用冒号标示,说明紧跟着的是一个参数说明。参数列表可以带多个参数,参数之间还可以插入参数说明,而且建议这么做,这是OC里个人很喜欢的一点。
    OC的对象创建,书中推荐使用 [[Object alloc] init]; 方式,很清楚地可以知道创建一个对象到底做了什么事情,应该也是为了提醒不要造成内存泄露吧~对了,和Java的引用不同,OC里面还是要写星号的:
    Object obj = [[Object alloc] init];

    给对象发消息,也就是方法调用,OC的方式很人性化、口语化,这个在上一篇里有说到,这里就不赘述了。需要注意的是,OC也是有点运算符的,用来访问对象的属性,相比于方括号还是方便的多。

总结

刚看了三分之一,所以也没有太多写的。这次学习语言,还努力地把课后习题都做了,满满的正能量啊!附上课后习题答案地址,做完可以对照下:OC程序设计答案