一、Objective-C语言简介
Objective-C是面向对象的语言
由Brad Cox基于Smalltalk改进而来,遵从ANSI C标准C语法,同时使用了Smalltalk的方法,在运行时可以灵活处理所有事情
Objective-C语言的优点
运行时非常灵活:
Dynamic Binding动态绑定
Dynamic Typing 动态检查
Dynamic Linking 动态链接
Objective-C可以认为是继承了C和Smalltalk优点
2、Objective-C语言注意事项
1>Objective-C语言学习注意
Objective-C语言不是一门全新的语言
C语言的基础上增加了一层最小的面向对象语法
Objective-C完全兼容C语言
可以在Objective-C代码中混入C语言代码,甚至是C++代码
可以使用Objective-C开发Mac OS X平台和iOS平台的应用程序
总结:
1>#import
在C和C++中采用#include指令,在本例中也可以采用#include,而#import是#include改进指令,它可以防止头文件重复包含问题。
2>int main(int argc, const char *argv[]),这个方法是程序的入口。参数argc-参数数目,argv-参数值。
3>@autoreleasepool{}这是一个自动释放池,用于回收对象的存储空间
4>NSLog是Foundation框架提供Objective-C日志输出函数,与标准C中的printf函数类似,并可以格式化输出。
@"Hello, World!",是代表NSString字符串对象,它是Objective-C常用的字符串类
5>最后是return 0语句,它表示要终止main的执行,一般情况下0代表正常结束,非0代表异常情况,这是沿用了C语音的习惯。
小结1:import和include的区别
> include 和 import 都是引入头文件
> import引入的头文件,可以防止重复包含
> include它是使用预处理指令防止重复包含,如果没有写预处理指令,则无法防止重复包含问题
小结2:Foundation/Foundation.h 有什么作用
>头文件
>头文件的位置
>文件包含了其他的大量的头文件,这样在用Objective-C中的函数时可以直接调用
>把Foundation.h引入了,等于把OC的库文件都引入了
3、NSLog函数使用方法
1>NSLog函数的介绍
NSLog 是 cocoa 的框架中提供的一个方法
NSLog 的定义
NSLog 定义在NSObjCRuntime.h中
2>特点
基本上,NSLog 很像printf,同样会在console中输出显示结果。
不同的是,传递进去的格式化字符是NSString的对象,而不是chat *这种字符串指针
3>NSLog函数和 printf 函数的差异
演示程序如下:
打印如下:
从这个程序我们可以了解:
>定义字符串使用NSString来定义,而字符串的内容也要用@" "来定义
例如:@"I LOVE China!"
>在输出字符串时,使用%@来充当占位符 (%@是OC特有的)
>它输出的格式为:@" "其中要输出的内容在" "之间,输出也可以是格式化输出
>不能使用printf打印OC中的对象,%@占位符不能使用,没有输出
还有一些差异:
NSLog 会自动换行 而printf不会自动换行
NSLog 会自动输出时间等项目信息,printf不会输出调试信息
NSLog 函数的参数是一个NSString 对象
printf 是一个字符串常量指针
4、OC中注释及@符号使用
1>“@” 的使用方法
在OC中“@” 有特殊的用法
1)@""这个符号表示将一个C的字符串转化为OC中的字符串对象NSString
2)@标识符OC中大部分的关键字都是以@开头的,比如@interface、@end等
2>OC中注释
OC中的注释有两种
>单行注释://
>多行注释:/**/
>文档注释
/**
*狗吃食的方法
*
*@param foodName 参数描述
*/
程序编译时,不对注释做任何处理
注意可以出现在程序的大部分的位置
总结:
C语言和OC语言中关于注释是一样的
二、OC 和 C差异学习
1、源文件对比
在C语言中,我们遇到不同后缀的文件有哪些?
.c:源文件
.o:目标文件
.out:可执行文件
.h:头文件
在OC语言中,我们遇到不同后缀的文件有哪些?
.h:头文件,头文件包含方法,属性的声明
.m:类的实现文件,参与编译的文件,用来实现类中声明的方法
2、数据类型对比
C中常用的数据类型
数据类型:
基本类型:整形:短整型short
整形int
长整型long
字符型:char
实型:单精度型 float
双精度型 double
构造类型:数组
结构体 struct
共用体 union
枚举类型 enum
指针类型
空类型 void
定义类型typedef
OC中的数据类型
OC数据类型
基本数据类型:数值型:整形类型
浮点型
字符型 char
布尔型 BOOL
空类型 void
Block类型
指针数据类型:类 class
id 类型
特殊类型 SEL、nil
BOOL:字面常量只是YES或则NO
NSObject *:OC中的对象类型
id:动态对象类型,万能指针
SEL :选择器数据类型
block:代码块数据类型
3、变老的定义对比
1>C语言的关键字都可以在OC源程序中使用
2>OC新增的关键字在使用时,注意部分关键字以"@"开头
4、流程控制语句对比
> ifelse
>switch
>while
>dowhile
>for
新增:增强型for循环,可以快速遍历数组、字典等集合
格式为:
NSArray *arr=@[@"one",@"two",@"three"];
for(NSString *str in arr)
{
NSLog(@"%@",str);
}
5、函数(方法)定义和声明对比
C语言中函数的声明和实现
函数声明
int sum(int a, int b);
函数定义
int sum(int a, int b)
{
return a+b;
}
OC语言中函数习惯称之为“方法”
方法声明:
-(int)sum:(int) a and:(int) b;
方法定义:
-(int)sum:(int) a and:(int) b
{
return a+b;
}
6、OC新增的数据类型介绍
1)逻辑型
1>Boolean
Boolean 类型指的是用于存储 真值 和 假值 的变量,一般用于程序流程控制。
Boolean 类型数据允许取值 true 或 false ,也可以是 0 或 非0的整数替代 true 和 false,这点和java语言不同。
实例程序如下:
打印如下:
2)BOOL也是用作逻辑 判断
与Boolean不同的时BOOL定义的变量通常赋值为 YES 或 NO也可以赋值为 1或者 0
实例程序如下:
打印如下:
总结:
Boolean 类型和BOOL 类型都是逻辑类型,之所以会引入这两种类型的逻辑类型是因为这两种类型定义的变量占用1个字节,而如果用int类型来定义一个标识符,那么它将占用4个字节。
7、OC中的新增异常捕捉方法
代码有可能抛出有异常的代码封闭在一个@ try块。@catch()块包含为@ try块抛出的异常的异常处理逻辑。一个@ finally块包含代码必须执行是否引发异常与否。您可以使用@throw指令抛出一个异常,这基本是一个对Pbjective-C对象的指针。你可以使用NSException对象但不限于他们
格式:
@try{
//如果有异常
<#statements#>
}
@catch (NSException *exception)
{
//捕捉最具体的异常类型
<#handler#>
}
@catch(NSException *ne)
{
//捕获一个比较重要的异常类型
}
@catch (id ue)
{
//再次投出捕获的异常
}
@finally
{
//不管有没有异常finally内的代码都会执行
<#statement#>
}
三、面向对象编程
1、编程的实质是什么
软件编程就是将我们的 思维转变成计算机能够识别的语言的一个过程
面向对象是相对于面向过程而言的,面向对象和面向过程都是一种思想
2、面向对象的概念
面向对象至今还没有统一的概念,通常定义为:按人们认识客观世界的系统思维方式,采用基于对象(实体)的概念建立模型,模拟客观世界分析、设计、实现软件的方法。通过面向对象的理念使计算机软件系统能与现实世界中的系统一一对应。
>面向对象编程
是一种解决软件复用的设计和编程方法。这种方法把软件系统中相近相似的操作逻辑和操作应用数据、状态,以类的形式描述出来,以对象实例的形式在软件系统中复用,以达到提高软件开发效率的作用。
>面向对象编程的优点:
大幅度提高软件项目的成功率
减少维护费
提高可移植性
>面向对象设计主要特征
封装性
多态性
继承性
3、面向对象和面向过程的区别
面向过程
强调的是功能行为
关注的是解决问题需要哪些步骤
面向对象
将功能封装进对象,强调具备了功能的对象
关注的是解决问题需要哪些对象
面向对象是基于面向过程的
四、类和对象
1、类和对象
类(class)
类是具有相似内部状态和运动规律的实体的集合(或统称、抽象)。类的概念来自于人们认识自然、认识社会的过程。在这一过程中,人们主要使用两种方法:由特殊到一般的归纳法和由一般到特殊的演绎法。
在归纳的过程中,我们从一个个具体的事物中把共同的“特征”抽取出来,形成一个一般的概念,这就是“归类”。
比如:昆虫、狮子、爬行动物,以为它们都能动所有归类为动物。
在演绎的过程中我们又把同类的事物,根据不同的特征分成不同的小类,这就是“分类”。
比如:动物-->猫科动物-->猫--->大花猫等。
对于一个具体的类,它有许多具体的个体,我们就管这些个体叫做“对象”。
类的内部状态是指类集合中对象的共同状态:类的运动规律是指类集合中对象的共同运动规律
比如:柏拉图对人做如下定义:人是没有毛、能直立行走的动物。
在柏拉图的定义中“人”是一个类,具有“没有毛、直立行走”等一些区别于其它事物的共同特征:而张三、李四、王五等等一个个具体的人,是“人”这个类的一个个“对象”
对象(object)
即指现实世界中各种各样的实体。它可以指具体的事物也可以值抽象的事物。如:整数1、2、3、苹果、飞机、规则、法律、表单、刘翔等等。每个对象皆有自己的内部状态和运动规律,如刘翔具有名字、身高、体重等内部状态。具有吃饭、睡觉等等运动规律。在面向对象概念中我们把对象的内部状态称为属性、运动规律称为方法或事件。
消息(Message)
消息是指对象间相互联系和相互作用的方式。一个消息主要由5部分组成:
发送消息的对象
接收消息的对象
消息传递办法
消息内容(参数)
反馈
总结:
>OC中描述事物通过类的形式体现,类是多个同种类型事物的抽象
>一个类可以实例化多个对象
2、类和对象之间的关系
类(Class)一个类由3个部分构成
类的名称呢:类名
类的属性:一组包含数据的属性
类的方法:允许对属性中包含的数据进行操作的方法
对象(object)
是系统中的基本允许实体
对象就是类 类型(class type)的变量
定义了一个类,就可以创建这个类的多个对象
一个类就是具有相同类型的对象的抽象
例如:
人的类设计:
事物名称(类名):人(person)
属性:身高(height)、年龄(age)
行为(功能):跑(run)、打架(fight)
3、类的声明和实现
1)
类:
.h:类的声明文件,用于声明成员变量、方法,类的声明关键字@interface和@end
注意:.h中的方法只是做一个声明,并不对方法进行实现。也就是说,只是说明一下方法名、方法的返回值类型、方法接收的参数类型而已,并不会编写方法内部的代码
方法:
方法的声明和实现,都必须以 + 或者 - 开头
+表示 类方法 (静态方法)
-表示 对象方法(动态方法)
在.h中声明的所有方法作用域都是 public类型,不能更改
成员变量(实例变量\属性)
成员变量的常用作用域有3种:
@public全局都可以访问
@protected只能在类内部和子类中访问
@private只能在类内部访问
2)声明一个类
>声明类使用关键字 @interface
>声明类,我们通常放到 .h 的头文件中
例如:
@interface NewClassName:ParentClassName
{
实现变量\成员的属性
}
方法的声明
@end
3)实现一个类
>实现一个类 使用关键字:@implementation
>实现一个类通常放到.m的文件中
>实现类主要是对方法的具体实现
例如:
@implementation NewClassName
{
//方法的实现
//code
}
@end
下面我们通过实例来演示
程序如下
4、创建一个对象并访问成员变量
1)创建一个对象
我们用类的方式告诉了 计算机我们需要一个什么样的对象,之后我们要在程序中使用这个对象,就必须先创建一个对象
格式:
类名 * (类名)类型的指针变量 = [类名 new];
Person *person=[Person new];
只要是用new操作符定义的实体就会在堆内存中开辟一个新的空间
总结:
[Person new];做了3件事
1>向计算机申请内存空间
2>给类中的每一个成员初始化值
3>返回新申请的空间的首地址
表示:定义了一个Person类型的指针变量,指针变量指向新申请的内存空间
表示:用Person 类实例化了一个实例对象,对象的名称是person
下面我们通过实例来看
程序如下:
打印如下
五、方法的声明实现及调用
说明:
OC中的方法就是C语言中的 函数
C语言中的函数包含:
无参无返回值
无参有返回值
有参无返回值
有参有返回值
1、无惨方法声明实现及调用
方法声明格式(注意方法声明是在 类 定义中书写的):
方法类型标识符 (返回值类型)方法名:(参数类型)参数1 方法名:(参数类型)参数2
-(void)personRun:(int) a and:(int) b;
说明:
>personRun: and: 总体是这个方法的名称
>" - "表示:方法类型的标示符
>void 表示:方法的返回值类型
>personRun:表示:方法名的一部分
>int 表示:方法参数的类型
> a 表示:参数名
>int 表示:方法参数的类型
> b 表示:参数名
OC中的方法分为:
对象方法
类方法
对象方法
>对象方法以 - 开头如-(void)run;
>对象方法只能由对象来调用
>对象方法中可以访问当前对象的成员变量
>调用格式[对象名 对象方法名];
类方法
>类方法以 + 开头如 +(void)run;
>类方法只能由类来调用
>类方法中不能访问实例(成员)变量,因为类方法由类来调用,并没有创建存储空间来存储类中的成员变量
>调用格式:[类名 类方法名];
>类方法的好处 和 适用场合:
不依赖于对象,执行效率更高
能用类方法解决的问题,尽量使用类方法
场合:当方法内部不需要使用到成员变量时,可以改为类方法
方法的调用
使用对象调用方法就是OC中的消息机制
OC语言中采用特定的语言调用 类 或者 对象 的方法称为发送消息或方法调用。
例如:
[类名或者对象名方法名];
下面通过实例来看
打印如下
2、有参方法声明实现及调用
1)带参数的方法的声明
方法类型标识符 (返回值类型)方法名:(参数类型)参数1 方法名:(参数类型)参数2
-(void)personRun:(int) a and:(int) b;
说明:
>personRun: and: 总体是这个方法的名称
>" - "表示:方法类型的标示符
>void 表示:方法的返回值类型
>personRun:表示:方法名的一部分
>int 表示:方法参数的类型
> a 表示:参数名
>int 表示:方法参数的类型
> b 表示:参数名
2)有参方法调用
[指针变量名 方法名1: 实际参数 方法名2: 实际参数2];
实例如下
程序如下:
打印如下: