本次是OC的第一节课,主要是学习和理解类与对象
1、面向对象
1> OOP(Object Oriented Programming)面向对象编程。
面向对象以事物为中心,完成某件事情都需要哪些事物来参与,参与该事件的事物都有哪些功能,完成该事件需要这些事物相互协作共同完成,并且完成该事件只是所有事物功能中其中的?个?功能。
2> 面向对象与面向过程的区别
3> 面向对象优点
面向对象具有良好的可扩展性和重用性。
面向对象可以降低我们代码的耦合度,提高代码的可移植性。
面向对象接近于日常生活和自然的思考方式,可以提高我们软件开发的效率和质量
4> 面向对象编程
面向对象编程的核心是转变考虑问题的方式。当我们看到一个问题的时候,我们不需要再考虑完成该事件需要怎样的步骤,而是考虑完成该事件都需要哪些对象(事物)参与,每一种事物都有哪些特征和行为。完成相应的事件需要不同的事物根据自身的行为,协调完成该事件。
2、OC概述
1> OC语言的特点
C语言的超集,允许在OC中使用C语言代码,编译器兼容C语言程序
具备完善的面向对象特性:封装、继承、多态。
包含一个运行时系统。
类库丰富。
2>OC与Swift
Objective-C和Swift虽然语法上差异很大,但是背后的思想以及所依托的类库都是相同的。
3、类和对象的概念和区别
1> 类:具有相同特征和行为的事物的抽象
2> 对象:类的实例,万事万物皆是对象
4、类和对象的定义
1> 类的定义
面向对象的核心思想是类和对象。
OC中类的定义分为两个部分:接口部分和实现部分。
接口部分:对外声明类的特征和行为。(.h文件中)
实现部分:行为的具体实现。(.m文件)
2> 接口部分
1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 { 5 // 声明实例变量 6 NSString *_name; // 姓名 7 int _age; // 年龄 8 NSString *_sex; // 性别 9 double _height; // 身高 10 NSString *_hobby; // 爱好 11 } 12 13 // 吃饭 14 - (void)eat; 15 16 // 睡觉 17 - (void)sleep; 18 19 // 学习 20 + (void)study; 21 22 @end
@interface和@end成对出现,表示类的接口部分(声明部分)
用来声明类的实例变量(特征)和方法(行为)
Person表示类名
: 表示继承关系 : 后面的类名表示父类名
NSObject 基类
① 实例变量
代码5-10行,声明实例变量必须在大括号{...}中
OC中的类型,声明实例变量的时候后面加 *
C语言中的基本数据类型,类型后面不加 *
实例变量的命名规则:以下划线 ‘_‘ 开头(书写规范), 首字母小写,遵循驼峰命名法
② 定义方法
OC中的方法分为两类
第一种:‘+‘ 号方法(类方法),由类名调用
第二种:‘-‘ 号方法(对象方法或实例方法),由对象调用
3> 实现部分
1 #import "Person.h" 2 3 @implementation Person 4 5 // 吃饭 6 - (void)eat { 7 NSLog(@"吃"); 8 } 9 10 // 睡觉 11 - (void)sleep { 12 NSLog(@"睡"); 13 } 14 15 // 学习 16 + (void)study { 17 NSLog(@"好好学习,天天向上"); 18 } 19 @end
@implementatiom和@end成对出现,类的实现部分
实现Person类中定义的方法
Person 表示类名
4> 对象的创建
类是一个抽象的概念,在实际开发中程序的运行时通过对象间的相互协作来完成
对象是类的实例,通过类来创建对象
1 int main(int argc, const char * argv[]) { 2 @autoreleasepool { 3 // 第一种 4 // 申请存储空间 5 Person *p1 = [Person alloc]; 6 // 初始化p1对象 7 p1 = [p1 init]; 8 9 // 第二种(常用) 10 // 消息嵌套机制 11 Person *p2 = [[Person alloc] init]; // alloc 申请存储空间,init 初始化对象 12 13 // 第三种 14 // new 等同于 alloc 和 init 15 Person *p3 = [Person new]; 16 17 // OC中使用 [] 给方法发送消息 18 [p2 eat]; // 使用对象名调用对象方法 19 [p2 sleep]; 20 [Person study]; // 使用类名调用类方法 21 } 22 return 0; 23 }
创建对象
① 定义类
② 开辟存储空间
③ 初始化
上面的代码中有三种方式,一般在工程中使用第二种
开辟空间
+ (instancetype)alloc;
‘+‘ 表示方法是类方法,只能由类调用。instancetype返回值类型,可以用id(任意对象类型)替代
初始化
- (instancetype)init;
‘-‘ 表示对象方法,对象调用。instancetype返回值类型,可以用id(任意对象类型)替代
5> 区别id和instancetype
① id和instancetype都可以作为方法返回值类型,都表示任意类型的对象
② instancetype可以返回和方法所在类相同的对象,id只能返回未知的类型
③ instancetype只能作为方法的返回值或参数类型,id不仅可以作为返回值类型,还可以用来作为定义变量的类型
④ 在init方法中,id和instancetype作为返回值类型是没有区别的
5、实例变量的可见度
实例变量可见度分别是:@public,@protected,@private
外界想要访问对象实例变量,实例变量需要通过@public修饰。
实例变量没有指定可见度的情况下,默认是@protected
三种可见度的区别
5、方法
1> 方法分类
方法分为对象方法和类方法
对象方法 以减号 - 开头, 只能由对象调用,对象方法中能访问成员变量(实例变量)
类方法 以加号 + 开头, 只能由类(名)来调用, 类方法中不能访问成员变量(实例变量)
2> 方法名
1 // _isMarried的getter方法 2 // 方法名:isMarried 3 - (BOOL)isMarried; 4 // _isMarried的setter方法 5 // 一个参数方法名setIsMArried: 6 - (void)setIsMarried:(BOOL)isMarried; 7 // 多个参数方法名:setHoddy: weight: address: isMarried: 8 - (void)setHoddy:(NSString *)hoddy 9 weight:(double)weight 10 address:(NSString *)address 11 isMarried:(BOOL)isMarried;
方法名的确定请参考以上代码
6、setter和getter方法
实例变量如果是受保护类型的,外界无法直接访问,外界如果要访问实例变量,需要本类提供方法,外界访问的话直接调用相应的方法即可
1> 外界操作实例变量通常对实例变量赋值和取值操作
setter方法:本类提供的用来给实例变量赋值的方法
getter方法:本类提供的用来给实例变量取值的方法
2> 方法命名
setter方法:以set开头,后面跟上实例变量名(没有下划线)
getter方法:实例变量名去掉下划线 _
以下是一个较完整的类定义的代码
Goddess.h
1 #import <Foundation/Foundation.h> 2 3 @interface Goddess : NSObject 4 { 5 // 声明实例变量 6 7 // 实例变量没有指定可见度的情况下,默认是@protected 8 NSString *_speciality; // 特长 9 10 @public // 公共的 11 NSString *_name;// 姓名 12 int _age; // 年龄 13 14 @protected // 受保护的 外界无法访问,可以被子类继承 15 NSString *_hoddy; // 爱好 16 double _weight; // 体重 17 18 @private // 私有的 外界无法访问,不可以被子类继承 19 NSString *_address; // 地址 20 BOOL _isMarried; // 是否已婚 21 } 22 // _hoddy的setter方法 23 - (void)setHoddy:(NSString *)hoddy; 24 25 // _hoddy的getter方法 26 - (NSString *)hoddy; 27 28 // _weight的setter方法 29 - (void)setWeight:(double)weight; 30 31 // _weight的getter方法 32 - (double)weight; 33 34 // _address的setter方法 35 - (void)setAddress:(NSString *)address; 36 37 // _address的getter方法 38 - (NSString *)address; 39 40 // _isMarried的setter方法 41 - (void)setIsMarried:(BOOL)isMarried; 42 43 // _isMarried的getter方法 44 - (BOOL)isMarried; 45 46 // 定义多参的方法 47 // 方法名:setHoddy: weight: address: isMarried: 48 - (void)setHoddy:(NSString *)hoddy 49 weight:(double)weight 50 address:(NSString *)address 51 isMarried:(BOOL)isMarried; 52 53 @end
Goddess.m
1 #import "Goddess.h" 2 3 @implementation Goddess 4 5 // _hoddy的setter方法 6 - (void)setHoddy:(NSString *)hoddy { 7 _hoddy = hoddy; 8 } 9 10 // _hoddy的getter方法 11 - (NSString *)hoddy { 12 return _hoddy; 13 } 14 15 // _weight的setter方法 16 - (void)setWeight:(double)weight { 17 _weight = weight; 18 } 19 20 // _weight的getter方法 21 - (double)weight { 22 return _weight; 23 } 24 25 // _address的setter方法 26 - (void)setAddress:(NSString *)address { 27 _address = address; 28 } 29 30 // _address的getter方法 31 - (NSString *)address { 32 return _address; 33 } 34 35 // _isMarried的setter方法 36 - (void)setIsMarried:(BOOL)isMarried { 37 _isMarried = isMarried; 38 } 39 40 // _isMarried的getter方法 41 - (BOOL)isMarried { 42 return _isMarried; 43 } 44 45 // 定义一个多参的方法 46 - (void)setHoddy:(NSString *)hoddy 47 weight:(double)weight 48 address:(NSString *)address 49 isMarried:(BOOL)isMarried { 50 51 _hoddy = hoddy; 52 _weight = weight; 53 _address = address; 54 _isMarried = isMarried; 55 } 56 57 @end