Effective-Objective-C-读书笔记-Item-1

前言

一直都在做项目,没什么时间作总结,感觉很不是滋味。现在放假了,嗯,终于有时间了~~哈哈(天生程序猿一枚好不好=。=)
最近开始读英文版的Effective Objective-C 2.0,觉得不错,就总结些东西,分享给各位读者吧。

Item 1 - Familiarize Yourself with Objective-C’s Roots

第一章的目的,就是让大家熟悉Objective-C,自然,标题的意思也就是“了解Objective-C的基本概念”,不多说,开写。

消息与运行时

总的来说,Objective-C跟C++、Java这些面向对象的语言是非常相似的,但是还是有许多不同的地方。如果你是第一次看到Objective-C的语法,一定觉得非常奇怪,因为Objective-C使用的是基于消息(Message)的框架,而不是传统的方法、函数调用。如下:

1
2
3
4
5
6
7
8
9
10
11
//Objective-C
Person *person = [Person new];
[person setName:@"tutuge" age:24];
//Java
Person person = new Person();
person.setNameAndAge("tutuge", 24);
//C++
Person *person = new Person;
person->setNameAndAge("tutuge", 24);

很奇怪是不是,各种中括号。但是我觉得,Objective—C这么设计就是为了时刻提醒你,“我是基于消息机制的!”。消息,的确是Objective-C与Java、C++这种语言最大的不同,而且,这种不同远不止在语法上面。简单来说如下两点:

  • 基于消息的调用: 所有的函数调用都是在“运行时”决定的。
  • 基于方法的调用: 所有的函数调用都是在“编译时”决定的,就是编译器编译时决定的。

其实,连被调方法的对象类型,都是在运行时决定的。所以说,Objective-C的运行时系统,担负了绝大部分的工作。这么设计的优点,举个例子,就是当运行时系统升级时,原有的代码不用重新编译即可“享受”升级带来的好处。

C的超集

Objective-C是C语言的超集,所以C语言所具有的一切特性,Objective-C都可以兼容,充分理解C语言的内存模型,对理解Objective-C很有帮助。如下:

1
NSString *str = @"a string";

这一行代码跟C语言没有什么不同,(忽略@符号=。=),原理跟C语言也是一致的,就是str指针是NSString类型的指针,指向了一块存着字符串“a string”的内存区域。不同的是,在Objective-C里,所有的对象只可以声明为指针类型,所以如下代码是不合理的:

1
NSString str;

为了更充分的理解,咱们看看如下例子:

1
2
NSString *str1 = @"a string";
NSString *str2 = str1;

熟悉C语言的朋友应该知道这是怎么回事,内存当中只有一块区域储存着“a string”这个字符串,str1、str2都是指向着这个区域的字符串指针。如下图:

image

  • str1、str2都在栈内存上分配的,就是字符串(NSString)类型的指针。
  • “a string”字符串实际储存在堆内存上。
  • str1、str2均指向同一块内存区域。

此处的栈内存、堆内存跟C语言中的概念也是一样的,不同的是,在Objective-C中,我们不用手动去malloc、free内存,Objective-C使用内存计数计数帮我们管理内存。

结构体,基本类型

在Objective-C中,并不是所有的变量都是指针类型的,像int、float、double这些依旧是传统的“栈上分配”的,当然,还有结构体struct、枚举enum、联合union等。如:

1
2
CGPoint point = CGPointMake(10, 10);
CGRect frame = CGRectMake(0, 0, 10, 10);

这的CGPoint、CGRect都是结构体,但是都是直接在栈上分配内存的,以减少过度使用Objective-C类型的类(减少运行时的压力),各位读者使用的时候要注意。

总结

零散的说了一些Objective-C的特点,远远不足以讲明白Objective-C,我这只是根据Effective Objective-C这本书给个引子,还是推荐Apple的官方教程、文档,要想掌握扎实,还是要一步一步来~


当前网速较慢或者你使用的浏览器不支持博客特定功能,请尝试刷新或换用Chrome、Firefox等现代浏览器