当前位置: 首页 > 工具软件 > Objective-C > 使用案例 >

objective-c语言特点及基础(相较于C语言)

郭修平
2023-12-01

一、简介

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头文件
.mObjective-C源程序
.mmObjcctive-C++源程序
.o、 .outC、C++、Objective-C语言编译后生成的文件
.cC语言源程序
.cc、.cppC++语言源程序

如果实现文件需要引入头文件时,推荐使用#import,跟#include作用相同,优化了确保相同文件只会被引入一次,所以倾向用#import。

三、基本数据类型

类型字节数格式化输出
char1%c
int4%i,%x,%o
unsigned int4%i,%x,%o
short int2%hi,%hx,%ho
unsigned short int2%hi,%hx,%ho
long int8%li,%lx,%lo
unsigned long int8%lu,%lx,%lo
long long int8%lli,%llx,%llo
unsigned long long int8%llu,%llx,%llo
float4%f
double8%f
long double16%lf

其他数据类型

id类型
可以存放任何数据类型的对象,其被定义为指向对象的指针(本身就是指针了),故定义比如id instance = nil;id类型是多态和动态绑定的基础。

BOOL类型
布尔值为YES/NO或1/0。

nil和Nil
nil表示一个对象,这个对象的指针指向空。Nil是定义一个指向空的类而不是对象。

NSString(不可变字符串)等等

四、Objective-C的主要基本格式

#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()输出函数及格式字符

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的对象

另外OC中的:

  1. 数据类型和运算符
  2. 顺序、分支、循环、控制循环结构
  3. 数组
等大部分内容都与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参数为:我在学习

上面分别定义了不带参数、无返回值的块,带参数、有返回值的块,以及带参数、无返回值的块。程序不仅可以在定义块变量的同时对块变量赋值,也可以先定义块变量,再对块变量赋值。

从上面的程序可以看出,块变量与函数指针非常相似;而块则非常像一个匿名函数。当程序调用块时,调用块的语法与调用函数完全相同。因此,可以把块当成一种简化的函数。

 类似资料: