概览
前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作、内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会继续扩充。今天我们正式开始学习Objective-C,以后简称“ObjC”,ObjC是在C语言的基础上加上了一层面向对象的特性,它完全兼容C语言,甚至可以混写C++。它是Mac OS X和IOS的主要开发语言,从IOS发布之后可以说ObjC的地位呈直线上升趋势,当前ObjC已经是仅次于C语言、Java的第三大编程语言。今天我们先简单的看一下C语言的一些基础内容:
第一个ObjC程序
打开Xcode,创建一个新项目
选择命令行程序
选择程序语言为Ojbective-C并输入项目名称
选择保存目录
默认生成一个基本的项目结构
程序源代码
// // main.m // Basics // // Created by Kenshin Cui on 14-2-1. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSLog(@"Hello, World!"); } return 0; }
上面是通过Xcode创建的第一个ObjC程序,这是一个经典的“Hello,World!”。运行结果如下:
下面对上面的代码做一下简单解释:
- 首先#import是一个导入命令,类似于C语言的#include命令,但是相对于#include而言,#import有效的处理了重复导入的问题,在C语言中也提到过如何通过条件编译解决重复导入,而在ObjC中你不需要处理了,#import已经自动进行了重复处理;与#include类似,导入系统类库使用<>,导入自定义类库使用””;
- Foundation.h是Foundation框架中的头文件,这是ObjC中的一个基础类库,基本上后面我们用到的所有ObjC的代码都需要引入这个类库;
- @autoreleasepool是ObjC的关键字,它的作用是对包含在这个关键字后面大包括内的程序会自动进行内存回收,不需要开发人员手动释放无用的对象;当然表面上看起来这有点类似于C#和Java的内存垃圾回收机制,但是事实上他们的原理完全不同,以后再做具体解释。
- NSLog是标准输出函数,类似于C语言中的printf()函数,但是它会自动换行,当然它同样支持格式输出(例如%i表示输出整形数据,%f输出浮点型数据),这个函数在Fundation.h中声明;
- @”Hello,World!”,是一个字符串常量,在ObjC中字符串前需要使用@符号;
扩展--OjbC语法特点
- ObjC中没有命名空间(C#)或包(Java)的概念,那也就是说在同一个应用中不能同时存在两个完全相同的类名,通常情况下我们通过前缀加以区分,例如在ObjC中的NSString、NSLog中的NS就是前缀。
NS其实是NeXTSTEP缩写,是乔布斯离开苹果后在NeXT公司所开发的系统,这个操作系统在当时虽然没有获得广泛认同,但是却为后面Mac OX奠定了基础。
- ObjC中很多关键字都是以@开头(例如@autoreleasepool、@interface、@protocol),另外需要注意的是为了区分C语言中的字符串,ObjC中的字符串也必须加上@。
基本数据类型
在ObjC中的基本数据类型除了C语言中的char、int、float、double之外还有:
- BOOL类型,包含两个值YES和NO,其实ObjC中的布尔类型就是整数1和0;
- id类型,是一个对象类型,可以表示所有对象;
- NSString是Fundation框架中定义的字符串类型;
// // main.m // Basics // // Created by Kenshin Cui on 14-2-1. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { char a=‘a‘; int b=1; float c=8.5; double d=8.5e+12; char e=‘a‘; BOOL f=YES,g=NO; NSLog(@"a=%c,b=%i,c=%f,d=%f,e=%c,f=%i,g=%i",a,b,c,d,e,f,g); //结果:a=a,b=1,c=8.500000,d=8500000000000.000000,e=a,f=1,g=0 NSString *[email protected]"Hello,World!"; NSLog(@"str=%@",str); //结果:str=Hello,World! NSLog(@"object=%p",nil);//结果:object=0x0 } return 0; }
关于上面id类型在这里不做过多的解释,后面我们会专门说到,下面列出常用格式符:
注意
1.在C或者ObjC中整形可以使用%i也可以使用%d来格式化,只有使用scanf()输入的时候二者才有区别(由于%d始终被编译器解释为decimal intergeer所以即使输入010会被认为是整形10,而%i则会将前面的0或者0x认为此输入是八进制或十六进制整数);
2.%p本质就是输出指针地址,在32位编译器下对于一个指针类型使用%x输出和%p输出其实是一样的,只是后者会在前面加上“ox”(注意在64位编译器下由于指针长度8byte,而整形只有4byte所以%x输出的内容只是%p的低位数据);