Objective-C是C语言的扩展,因此,也具备很多C语言的基本特性,这里只罗列部分。
块(Blocks)
块是对C语言的一种扩展,它并未作为标准ANSI C所定义的部分,而是Apple添加到语言中的。它看起来很像函数,可以给它传递参数,它也具有返回值,与函数不同的是,块定义在函数或方法内部,并能够访问在函数或者方法范围内块之外的任何变量。一般来说,它可以访问到这些变量但是不能修改它们的值,有一个特殊的块修改器(由块前面含有两个下划线的字符组成)能够修改块内变量的值。块本身也能够作为参数传递给函数或方法。
块的其中一个优势在于能够让系统分配给其他处理器或应用的其他线程执行。
块是以插入字符“^”开头为标识的。后面跟的一个括号标识块所需要的参数列表。比如:
^(void){
....
}//没有分号
//这个块不接受参数
//也可以将块赋值给变量,如:
int (^myBlock)(void)=
^(void){
...
return somevalue;
};//赋值结束,有分号
块可以访问但是不能修改函数内块以外的变量,但是如果变量定义之前加了__block修改器,就可以了,比如函数内块以外的变量定义为
__block int foo=;
结构
除了数组之外,Objective-C还提供了另一种组合元素的工具,即结构。比如:
struct date
{
int month;
int day;
int year;
}
//
struct date today;//声明today变量为struct date类型
today.day=;//点符号是处理结构变量的特殊语法,用于访问结构成员
结构的初始化可以直接赋值,如:
struct date today={,,}//此时按顺序依次赋值
struct date today={}//只赋给第一个元素
struct date today={.month=,.day=,.year=}//指定顺序赋值
通常用typedef来改变结构体名称,使得在声明变量的时候不需要一直带着“struct”标识,比如:
struct CGPoint {
CGFloat x;
CGFloat y;
};
typedef struct CGPoint CGPoint; //声明变量时不需要再写struct了
CGPoint p;
下边的几种写法,也是合法的:
struct date
{
...
} date1,date2;
//
struct date
{
...
} date1={,,};
//
struct //省略结构名称
{
...
} date1={...};
//
struct
{
...
} dates[];//声明数组,元素为结构
指针
指针的工作方式是间接寻址的,它本身的值是一个地址,表示它所指向的变量的内存地址,声明时,通过在变量名前类型之后加上星号,如int *intPtr;这样intPtr就不能再被直接赋给int类型的值,而是内存地址,比如intPtr=&someValue;。
通过指针变量intPtr引用someValue的内容,可以使用间接寻址运算符(*),比如int x=*intPtr;
指针除了指向基本数据类型之外,还可以指向复杂的数据类型,如结构
struct s{...};
struct s sValue;
struct s *sPtr;
//
sValue.property=;
sPtr=&sValue;
(*sPtr).property=;
sPtr->property=;//这是结构指针的特殊运算符
函数指针
函数指针是指向函数的指针变量,此时需要知道函数返回值类型以及参数的数目和类型,比如要声明“指向返回int并且不带参数的函数的指针”,如下
int (*fnPtr) (void)
*fnPtr两侧的括号是必须的,此后可以用:fnPtr=loopFunc;(loopFunc是一个返回int且不带参数的函数)。
函数指针可以作为参数传递给其他函数,函数指针的另一个常见应用是建立分派表,函数本身不能保存在数组元素中,但是可以在数组中存储函数指针,就可以创建包含要调用的函数指针的表。
命令行参数
程序运行时开始执行的位置是main函数,直到main函数执行完,控制权返回给系统。调用main函数时,系统向它传递两个参数,第一个是argc(argument count),是一个整型值,第二个是argv(argument vector),是一个字符指针数组,长度为argc+1。
int main (int argc, char *argv[]){...}
argv数组的第一个元素是执行程序的名称指针,如果系统中没有程序名称,则为空串,数组的其他项指向由启动程序执行的命令行所指的值。数组argv中的最后一个指针arbv[argc]规定为空。