一、OC简介
OC全称 Objective-C,它通过一套全新的语法,在C语言基础上添加了面向对象的特性。OC语法频繁的使用方号,而且不吝于写出极长的方法名,虽然代码冗长,但十分易读。OC完全兼容C语言,且可以在OC代码中混入C语言代码,甚至是C++代码。我们可以使用OC开发Mac OS X平台和IOS平台的应用程序。
OC语言使用的是“消息结构”(messaging structure)而非函数调用(function calling)。OC语言是由Smalltalk演化而来的,后者是消息型语言的鼻祖。消息与函数调用之间的区别看上去就像这样:
//消息结构
Object *obj = [Object new];
[obj performWith:parameter1and:parameter2];
//函数调用
Object *obj = new Object;
obj->perform(parameter1,parameter2);
关键的区别在于:使用消息结构的语言,其运行时所应执行的代码由运行环境来决定;而使用函数调用的语言,则由编译器决定。
在OC中经常会用到几个概念,编译期,运行期与运行期环境。
编译期是指把的源文件交给编译器编译的过程,最终目的是得到可执行的文件。运行期是指可执行文件交给操作系统执行、直到程序执行结束的期间,执行的目的是为了实现程序的功能。运行期环境是指当应用程序运行起来后,为其提供相关支持的代码,它提供了一些使得对象之间能够传递消息的重要函数,并且包含创建类实例所用的全部逻辑。
二、OC语法的规范
1、关键字:基本上所有关键字都是以@开头的
一些常见的关键字有:
@interface、@implementation、@end @public、@protected、@private、@selector @try、@catch、@throw、@finally @protocol、@optional、@required、@class @property、@synthesize、@dynamic、 self、super、id、_cmd、__block、__strong、__weak、
2、字符串都是以@开头,
例如:@“hello world”
而C语言的字符串是“hello world”。
3、其他的语法
基本数据类型:char int float double BOOL(YES\NO)
nil:相当于C语言中的null
基本语句:循环语句(do while、while、for),条件语句(if、if-else、switch)
注释://和/*...*/
屏幕输出语句:
NSLog(@"hello");
NSLog(@"age is %i",27);
三、OC的开发过程
源文件:原文件就是指用OC写出来的代码保存为文件的结果
目标文件:目标文件是指源文件经过编译程序产生能被cpu直接识别的二进制文件
可执行文件:可执行文件就是指目标文件经过链接之后产生的可以在系统上执行的文件
四、第一个OC程序
1、代码编写:OC语言的入口是main函数,它写在 .m文件中
比如说在.m文件中写入如下代码
#include <stdio.h>
int main() {
printf("第1个OC程序\n");
return 0;
}
这是在oc里写c语言,照样能够编译运行。
2、终端指令:
编译:cc –c main.m
链接:cc main.o
运行:./a.out
执行的结果是在屏幕上打印 :第一个OC程序
五、第二个OC程序
1、 以OC代码写的main.m文件
#import<Foundation/Foundation.h>
int main(){
NSLog(@"第2个OC程序");
return 0;
}
2、终端指令
编译:cc –c main.m
链接:cc main.o –framework Foundation
运行:./a.out
由于使用了NSLog函数,所以需要引入框架文件 #import<Foundation/Foundation.h>,同时也要告诉编译器使用了框架 –framework Foundation
3、NSLog与printf的区别:
NSLog接收OC字符串作为参数且输出后会自动换行,printf接收C语言字符串作为参数输出后不会换行,使用NSLog需要#import <Foundation/Foundation.h>,使用printf需要#include <stdio.h>;
4、#import的作用
跟#include一样,用来拷贝某个文件的内容,可以自动防止文件内容被拷贝多次,也就意味着头文件中不用加入以下的预处理指令
#ifndef _STDIO_H_
#define _STDIO_H_
#endif
5、Foundation框架
开发OC、iOS、Mac程序必备的框架 ,此框架中包含了很多常用的API(应用编程接口)和头文件,若想使用整个框架的内容,只需包含它头文件Foundation.h即可,例如:
#import <Foundation/Foundation.h>
6、BOOL的使用
BOOL类型的本质:
typedef signed char BOOL;
BOOL类型的变量有2种取值:YES、NO
#define YES (BOOL)1
#define NO (BOOL)0
这两条指令会将程序中所有BOOL类型的1替换为YES,0则替换为NO
BOOL的输出(当做整数来用)
NSLog(@"%d %d", YES, NO);
六、第三个OC程序
1、多个.m文件开发
编写3个文件
main.m文件:
#import "one.h"
int main() {
test();
return 0;
}
one.h 文件:
void test();
one.m文件:#import <Foundation/Foundation.h>
void test(){
NSLog(@"调用了test函数");
//NSLog函数会自动换行
}
该函数的输出结果是:调用了test函数
终端指令
编译:cc –c main.m test.m//必须同时编译所有文件才能成功
链接:cc main.o test.o –framework Foundation
运行:./a.out
2、m文件和.c文件混用开发
编写3个文件
main.m 文件:
#import "one.h"
int main() {
test();
return 0;
}
one.h 文件:
void test();
one.c文件:
#include <stdio.h>
void test() {
printf("调用了test函数\n");
}
该程序的输出结果同样是:调用了test函数
终端指令
编译:cc –c main.m test.m
链接:cc main.o test.o
运行:./a.out //没有使用Foundation框架的话,就不用-framework Foundation
七、Object-C的工作原理
Object-C的重要工作都在“运行期组件”(runtime component)而非编译器完成的。使用OC的面向对象特性所需的全部数据结构和函数都在运行期组件里面。比如说:运行期组件中含有全部内存管理方法。运行期组件本质上是一种与开发者所编代码相链接的“动态库”(dynamic library),其代码能把开发者编写的所有程序粘合起来,这样的话,只需要更新运行期组件,即可提升应用程序性能。而像C++和JAVA那种许多工作都在“编译期”(compile time)完成的语言,若要获得类似性能提升,则要重新编译应用程序代码。