OC简介
在
C
语言的基础上,Objective - C
增加了一层最小的面向对象语法完全兼容
C
语言可以在
OC
代码中混入C
语言,甚至是C++
代码可以使用
OC
开发Mac OS X
平台和iOS
平台的应用OC
是面向对象的,C
是面向过程的,只是解决问题的不同思想面向对象(关注解决问题需要哪些东西)如,打电话找手机
面向过程(关注解决问题需要哪些步骤)如,打开手机,按号码,拨打
-
面向对象封装的好处
- 更接近人类的思考方式
- 只需要关注对象,不需要关注步骤
OC语法概括
-
基本所有关键字都是以
@
开头@interface、@implementation、@end、@public、@protected @private、@selector、@try、@catch、@throw、@protocol @optional、@required、@class、@property、@synthesize self、super、id、__cmd、__block、__strong、__weak
- 字符串以
@
开头
比如@"Hello"
是OC中的字符串,而"Hello"
则是C语言中的字符串 - 其他语法
基本数据类型 | int、char、float、double、BOOL(YES\NO)[本质是char ] |
---|---|
nil |
相当于C 语言中的NULL ,也就是 0 |
基本语句 | 循环语句do while 、while 、for 、条件语句if、if-else、switch
|
注释 |
// 单行注释、/*...*/ 多行注释 |
屏幕输出 |
NSLog(@"Hello"); 、NSLog(@"age is %i",24); 会自动换行 |
OC程序的开发过程
.m源文件
-> 编译 ->.o目标文件
-> 链接 ->a.out可执行文件
OC基础知识
-
#import
的用途- 跟
#include
一样,拷贝文件的内容 - 可以自动防止文件的内容被重复拷贝
- 跟
-
类和对象的关系
-
OC中的类
相当于造东西的图纸,用来描述一类事物,也就是说,要想创建对象,必须先有类 - 利用
类
来创建对象
,对象
是类
的具体存在 - 面向对象解决问题应该是,先考虑需要设计哪些
类
,再利用类创建多少个对象
- 每个 "对象" 内部默认有个 "isa 指针" 指向它的类
- 所有 "对象" 共用一份方法
- 每个类中有个“superclass 指针”指向它的父类
-
-
需要设计哪些
类
,如何设计类
-
类
的设计,只关心3样东西-
类名
(事物名称):人(VampireJune)- 第一个字母必须是大写
- 不能有下划线
- 多个英文单词用驼峰标识
-
属性
(配置) :身高(height)、年龄(age) -
行为
(功能):跑(run)、吃(eat)
-
一般名词都是
类
拥有相同(或类似)属性和行为的对象都可以抽出一个
类
-
-
完整地写一个
类
:类
的声明和实现// 引入 "Foundation" 框架,因为使用了 "NSObject" #import <Foundation/Foundation.h> 1. 类的声明:声明对象的属性和行为 @interface VampireJune : NSObject // 关键字 "@interface" 和 类名 "VampireJune" 之间必须有一个空格 // NSObject 目的是:让 "VampireJune" 这个类具备创建对象的能力 // ":" :类名 "VampireJune" 和 "NSObject" 之间的冒号是继承语法 {// 大括号里 "只能" 用来声明 "对象属性"( 实例变量\成员变量)默认会初始化为0 // @public 可以让外部的指针间接访问对象内部的成员变量 @public // "属性" (成员变量)默认是被保护的,不允许指针直接访问 int age; // 年龄,属性命名完,写一个 ";" 英文分号,告诉这个属性结束了 double weight; // 体重 } // 大括号里 "只能" 用来声明 "对象属性",必须要有 大括号 // 方法(行为): 方法名、参数、返回值 // 声明:在 "@interface @end" 中声明,不能放到大括号内 // 实现:在 "@implementation @end" 中实现 - (void) run; // 只要是OC对象的方法,必须以减号 "-" 开头 // OC方法中任何数据类型都必须用小括号 "()" 括住 // OC方法中的小括号 "()" :括住数据类型 @end // 表示类声明完毕 2. 类的实现 // 用来实现 "@interface @end" 中声明的方法 @implementation VampireJune // 方法的实现(说清楚方法里面有什么代码) - (void) run { // 访问自己对象内部的属性,直接写属性名 NSLog(@"%d岁、%f公斤的人跑起来了",age,weight); * "对象" 调用某个方法,会跟随 "isa 指针" 找到对应的类,在类里面找一找有没有这个方法 * 一旦发现有,就调用这个方法,来到方法对应的代码,访问当前对象的成员变量 } @end int main() { // 在OC中,想执行一些行为,就写上一个中括号 [行为执行者 行为名称]; // 利用类来创建对象 // 执行了 "VampireJune" 这个类的 "new" 行为来创建新对象 // [VampireJune new] 会创建出一个新对象,并返回新对象本身(新对象地址) // OC中想修改操纵对象,只能用指针 // 定义了一个指针变量 "v",将来指向 "VampireJune" 类型的对象 VampireJune *v = [VampireJune new]; // 给 "v" 所指向的对象的 "age" 属性赋值 v->age = 23; v->weight= 60.0; NSLog(@" age is %d,weight is %f",v->age,v->height); // 给 "v" 所指向对象 发送一条 "run" 消息(OC的消息机制) // 就会调用 这个对象的 "run" 方法,就会去对象的实现里面找这个方法 // 一旦找到这个方法,就会执行这个方法里面的代码 [v run]; return 0; }
-
@implementation
- 没有
@interface
,只有@implementation
,也能成功定义一个类 -
@implementation
中不能声明和@interface
一样的成员变量
- 没有
@implementation Car : NSObject
{
@public
int wheels; // 轮子
int speed; // 速度
}
- (void)run
{
NSLog(@"%d个轮子,%dkm/h的车跑起来了",wheels,speed);
}
@end
-
对象
与函数
参数- 对象成员变量作为函数参数
- 指向对象的指针作为函数参数
- 修改指向对象的成员
- 修改指针的指向
常见错误
- 只有类的声明,没有类的实现
- 漏了
@end
-
@interface
和@implementation
嵌套 - 两个类的声明嵌套
- 成员变量没有写在括号里面
- 方法的声明写在了大括号里面
语法细节
- 方法不能当做函数一样调用
- 成员变量不能在{}中进行初始化、不能被直接拿去访问
- 类的实现可以写在
main函数
的后面,一定写在类的声明
后面就可以
对象方法和函数的区别
-
对象方法
-
对象方法
都是以减号-
开头 -
对象方法
必须声明在 "@interface @end" 之间,必须实现在 "@implementation @end"之间,对象方法
不能独立与类存在 -
对象方法
只能由对象
调用 -
对象方法
归类\对象
所有 -
对象方法
中能访问当前对象的成员变量(实例变量)
-
-
函数
-
函数
不属于类,跟类没有关系,只归定义函数的文件所有 -
函数
能写在文件中的任意位置(除
"@interface @end"之间) -
函数
内部不能直接通过成员变量名访问某个对象的成员变量
-
对象方法的声明规范
- 方法首字母小写
- 从第二个单词开始,首字母大写
- 尽量写的像句子一样,可读性好
- 形参首字母小写,超过一个单词,其他首字母大写
- 形参与形参之间,一定要有一个空格
- 一个形参对应一个冒号,冒号也是方法名的一部分
- 返回值永远只有一个
- 类方法声明规范上面全部适用,只是减号
-
变为加号+
- 同一个类中不允许有两个对象方法同名
// 1. 无返回值
// 1.1 无形参
- (void)pi; // 方法名 :-pi
// 1.2 有形参
- (void)squareWithNum:(int)num; // 方法名 :-squareWithNum:
// 2. 有返回值
// 2.1 无形参
- (int)pi; // 方法名 :-pi
// 2.2 有形参
- (int)sumWithNum1:(int)num1 andNum2:(int)num2;
// 方法名 :-sumWithNum1: andNum2:
对象方法图例
// 无形参 有返回值
- (double)pi; // 方法名 :-pi
// 方法调用
[c pi];
// 有1个形参 有返回值
- (double)square:(double)number; // 方法名 :-square:
// 方法调用
[c square: 10];
// 有多个形参 有返回值
- (double)sumOfNum1:(double)num1 andNum2(double)num2;
// 方法名 :-sumOfNum1: andNum2:
// 方法调用
[c sumOfNum1: 10 andNum2: 21];