Objective-C是一种以C为基础,并结合Smalltalk特征扩充出来的面向对象语言,该语言于20世纪80年代初由 Brad J.Cox 创建。1988年,NeXT 公司获得了Objective-C语言的授权; 1996 年,Apple 公司收购了 NeXT 公司,这样 Objective-C 语言就变成了 Apple 公司的"御用"编程语言。2007年,Apple 公司发布了Objective-C的升级版,并称之为 Objective-C 2.0。
文件扩展名 | 意义 |
---|---|
.h | 头文件 |
.m | Objective-C源程序 |
.mm | Objcctive-C++源程序 |
.o、 .out | C、C++、Objective-C语言编译后生成的文件 |
.c | C语言源程序 |
.cc、.cpp | C++语言源程序 |
如果实现文件需要引入头文件时,推荐使用#import,跟#include作用相同,优化了确保相同文件只会被引入一次,所以倾向用#import。
类型 | 字节数 | 格式化输出 |
---|---|---|
char | 1 | %c |
int | 4 | %i,%x,%o |
unsigned int | 4 | %i,%x,%o |
short int | 2 | %hi,%hx,%ho |
unsigned short int | 2 | %hi,%hx,%ho |
long int | 8 | %li,%lx,%lo |
unsigned long int | 8 | %lu,%lx,%lo |
long long int | 8 | %lli,%llx,%llo |
unsigned long long int | 8 | %llu,%llx,%llo |
float | 4 | %f |
double | 8 | %f |
long double | 16 | %lf |
id类型
可以存放任何数据类型的对象,其被定义为指向对象的指针(本身就是指针了),故定义比如id instance = nil;id类型是多态和动态绑定的基础。
BOOL类型
布尔值为YES/NO或1/0。
nil和Nil
nil表示一个对象,这个对象的指针指向空。Nil是定义一个指向空的类而不是对象。
NSString(不可变字符串)等等
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
NSLog(@"Hello, World!");
}
return 0;
}
上述程序中第一行代码使用 import 导入 Foundation 框架下的 Foundation.h 头文件,这样就可以在程序中使用 Foundation 框架提供的 NSLog()输出函数。
main()函数中使用了@autoreleasepool{}来包含所有的代码,位于@autoreleasepool 之后的{}被称为自动释放上下文,其中的语句在"自动释放上下文"的环境中执行,该上下文会自动回收这些语句所创建的对象。这样做的目的是保证 Obiective-C能自动释放内存,避免引起内存泄漏。
NSLog()是 Foundation 提供的一个输出函数,该输出函数的功能非常强大,不仅可以输出字符串,还可以输出各种对象,后面程序还会见到大量使用 NSLog()函数进行输出的例子。 NSLog()函数的 NS 是一个前缀,Cocoa 对其所有的函数、常量、类型前面都会增加"NS"前缀,这个前缀用于区分该函数来自 Cocoa,而不是来自其他程序包。
NSLog()是 Foundation 提供的一个功能非常强大的输出函数,它不仅可以输出字符串,也可以输出整数、C 风格的字符串和 Objective-C 对象。
使用NSLogO)函数非常简单,它的第一个参数应该是一个字符串直接量,该字符串中可使用"%格式字符"形式的占位符,这个占位符将会由对应的变量填充。
代码格式如下:
//用NSLog函数输出val的值
int val = 5;
NSLog(@"%d" , val);//在双引号前要有@符号
//输出结果为:5
格式字符 | 说明 |
---|---|
d | 以带符号的十进制形式输出整数(正数不输出符号) |
o | 以八进制无符号形式输出整数(不输出 0 前缀) |
x | 以十六进制无符号形式输出整数(不输出 0x 前缀) |
u | 以无符号十进制形式输出整数 |
c | 以字符形式输出,只输出一个字符 |
s | 输出 C风格的字符串 |
f | 以小数形式输出浮点数,默认输出 6 位小数 |
e | 以指数形式输出浮点数,数值部分默认输出6 位小数 |
g | 自动选用%f或%e其中之一,保证以最简形式(占用宽度最小)输出,并且不会输出无意义的0 |
p | 以十六进制形式输出指针变量所代表的地址值 |
@ | 输出 Objective-C的对象 |
块(Block)是 Objective-C对 ANSIC所做的扩展,使用块可以更好地简化 Objective-C编程,而且 Objective-C 的很多 API 都依赖于块。
块的基本语法:
^ [块返回值类型](形参类型1形参丄,形参类型2形参2,...) {
//块执行体
}
从上面的语法格式可以看出,定义块的语法非常像定义一个函数,但只是定义一个匿名函 数。定义块与定义函数的语法格式存在如下差异。
(1)定义块必须以^开头。
(2)定义块的返回值类型可以省略,而且经常都会省略声明块的返回值类型。
(3) 定义块无须指定名字。
(4) 如果块没有参数,此时参数部分括号不能省略,但内部可以留空,通常建议使用void 作为占位符。
如果程序需要以后多次调用己经定义的块,那么应该将该块赋给一个块变量。定义块变量 的语法格式如下:
块返回值类型(八块变量名)(形参类型1,形参类型2,...);
例如:
#import <Foundation/Foundation.h>
int main(int argc , char * argv[]) {
@autoreleasepool {
//定义不带参数、无返回值的块
void (^printStr)(void) = ^(void) {
NSLog(@”我正在开始学习Objective-C的块”);
};
//使用printStr调用块
printStr();
//定义带参数、有返回值的块
double (^hypot) (double , double) = ^(double num1, double num2) {
return sqrt(num1 * num1 + num2 * num2);
}
//调用块,并输出块的返回值
NSLog(@"%g" , hypot(3 , 4));
//也可以先只定义块变量:定义带参数、无返回值的块
void (^print) (NSString*);
//再将块赋给指定的块变量
print = ^(NSString* info) {
NSLog(@"info参数为:%@" , info);
};
//调用块
print(@"我在学习");
}
}
//输出结果为:
我正在开始学习Objective-C的块
5
info参数为:我在学习
上面分别定义了不带参数、无返回值的块,带参数、有返回值的块,以及带参数、无返回值的块。程序不仅可以在定义块变量的同时对块变量赋值,也可以先定义块变量,再对块变量赋值。
从上面的程序可以看出,块变量与函数指针非常相似;而块则非常像一个匿名函数。当程序调用块时,调用块的语法与调用函数完全相同。因此,可以把块当成一种简化的函数。