Chapter 13 Underlying C Language Features

Arrays
这个跟C语言是一样的,例如下面这个:


这个实际上是声明了一个指针数组,不过在这里Objective-C直接把它成为Fraction对象数组。
InitializingArray Elements
如果是对数字型数组进行部分初始化,那么剩余部分会被自动初始化为0。
Objective-C允许你这样赋值:

在{}中用中括号+下标的形式来引用本数组元素,然后直接对它们赋值,顺序任意。数组的容量决定于最大的下标,是最大下标+1。
Character Arrays
未标明元素个数的数组会根据实际元素个数自动确定数组大小。
Objective-C字符串也是以\0结尾的。
Functions
这是个函数:
Chapter 13 Underlying C Language Features_第1张图片

Chapter 13 Underlying C Language Features_第2张图片

这是个方法:
Chapter 13 Underlying C Language Features_第3张图片

可以看出函数的类型是不用括起来的,而方法的不然。
反正总体来说Objective-C中的函数跟C语言中的函数是一样一样的。
Arguments and Local Variables
如果使用ARC(Automatic Reference Counting)的话,未被显式初始化的本地变量会被默认初始化为0。
Returning Function Results
如果函数返回值类型被省略了,则默认为int。
如果方法没写返回值类型,那么系统默认为它是id类型。
Declaring Return Types and Argument Types
函数在默认情况下具有外部连接属性。
如果你想把某函数限定在编译单元之内你就应该使用static关键字在其声明前面。
static函数的用法与C++中的相同。
Functions, Methods, and Arrays
函数接受数组为参数的写法与C语言的一样,也是需要数组名和数组长度。
由于函数接受的是数组的地址,所以函数改动的是数组本身。
Blocks
块的形式类似于函数,但是它们是两回事。
块可以定义在函数和方法之中。
块可以访问在块之外的任何变量,但是这个访问操作是只读,除非你使用 block。
块可以作为参数被传递给函数和方法。
块的优点之一是可以被系统发送给其他的处理过程或线程去执行。

^表示这个东西是一个块,它没有名称,后面跟的是形参列表。
你可以把一个块赋给一个变量,它的声明方式类似于给函数指针赋值,如下图所示:
Chapter 13 Underlying C Language Features_第4张图片

你要对这个变量做些修饰,比如返回值和参数都是void,用^表示它是一个块等。
执行块的方式和执行函数的方式是一样的,如下图所示:
Chapter 13 Underlying C Language Features_第5张图片

当你想在block内改变某变量的值时,可以在该变量的定义式前面加上
block,如下图所示:

Structures
Initializing Structures
结构体初始化的形式如下:

部分初始化结构体的形式如下所示:

像这种部分初始化的结构体,第一项被初始化为7,而其余项是未定义的。
你也可以在{}内对指定项赋值,如下图所示:


同样,第二张图的其余项也是未定义的。
Additional Details about Structures
在结构体定义时声明结构体变量:
Chapter 13 Underlying C Language Features_第6张图片

你也可以在这个时候对结构体变量初始化:
Chapter 13 Underlying C Language Features_第7张图片

和C/C++一样,你也可以定义无名结构体变量:
Chapter 13 Underlying C Language Features_第8张图片

Chapter 13 Underlying C Language Features_第9张图片

Pointersand Structures
声明一个结构体指针的方法如下所示:

Pointersand Arrays
针对于对象类型的数组的指针声明形式如下:

注意这里面有两个星号。
毫无疑问第一个星号代表它是一个它是一个指针,那么第二个星号代表什么呢?
因为一般的对象声明方式是Fraction fractsPtr,所以我想第二个星号仅仅代表它是一个对象,这两个星号合起来就是对象指针的意思。
该指针使用的形式如下:

这就是函数指针的解引用形式。
Pointers to Character Strings
Chapter 13 Underlying C Language Features_第10张图片

Objective-C在使用函数的时候还要声明下?这一点不同于C语言,在C语言当中如果函数定义在main上面就可以直接使用,不用这么费劲。
原来Objective-C的函数在这种情况下也不用声明,如下图所示:
Chapter 13 Underlying C Language Features_第11张图片

但是作者为啥还要在main中写声明呢,难道是顺手写的?
Constant Character Strings and Pointers
像@”hello world”这样的是字符串对象而不是字符串。
你可以把一个常量字符串赋给一个char
指针,但是你不能用常量字符串对char数组赋值,除非是初始化。
解引用操作符*和自加自减操作符具有相同的优先级都是按从右到左的顺序参与计算的。
Pointers to Functions
取函数地址的时候你可以在函数名前加一个&,但是这不是必须的。
They’re Not Objects!
在Objective-C中对象是可以接收消息的,你可以通过判断某东西是否能接收消息来判定它是不是对象。
Miscellaneous Language Features
Compound Literals
这是Objective-C中独有的语法,把一个无名类型放进一对括号中间后面跟一个初始化列表,这个无名类型是任意的。
比如:


上一个是无名结构体,下一个是无名数组。
你可以把它赋给同类型变量,也可以当作实参传递给函数和方法。
How Things Work
Fact 1: Instance Variables Are Stored in Structures
实例对象其实都存储在结构体中。
这个结构体中有叫isa的成员,它用来标识对象各成分所属的类。
@public指令可以使某成员具有public访问属性。
Fact 2: An Object Variable Is Really a Pointer

Objective-C中声明对象的方式其实是声明一个指针,其实这我早就知道了。

这只是单纯地指针之间的赋值,它俩指向同一个结构体。
Fact 3: Methods Are Functions, and Message Expressions Are Function Calls
方法的本质就是函数。
方法就是在函数名前面添加一个类名修饰而来的。
Fact 4: The id Type Is a Generic Pointer Type
一个返回id类型的方法其实也就是返回一个指针而已,该指针指向了某一个对象。
又因为对象的实质是结构体,结构体中有isa项,所以对象的类型可以被识别出来。

你可能感兴趣的:(Chapter 13 Underlying C Language Features)