博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS学习10之OC类和对象
阅读量:6420 次
发布时间:2019-06-23

本文共 6115 字,大约阅读时间需要 20 分钟。

本次是OC的第一节课,主要是学习和理解类与对象

1、面向对象

 1> OOP(Object Oriented Programming)面向对象编程。

 面向对象事物为中心,完成某件事情都需要哪些事物来参与,参与该事件的事物都有哪些功能,完成该事件需要这些事物相互协作共同完成,并且完成该事件只是所有事物功能中其中的⼀个⼩功能

 2> 面向对象与面向过程的区别

 3> 面向对象优点

  面向对象具有良好的可扩展性重用性

  面向对象可以降低我们代码的耦合度提高代码的可移植性

  面向对象接近于日常生活和自然的思考方式,可以提高我们软件开发的效率质量

 4> 面向对象编程

  面向对象编程的核心是转变考虑问题的方式。当我们看到一个问题的时候,我们不需要再考虑完成该事件需要怎样的步骤,而是考虑完成该事件都需要哪些对象(事物)参与,每一种事物都有哪些特征行为。完成相应的事件需要不同的事物根据自身行为协调完成该事件。

2、OC概述

 1> OC语言的特点

  C语言的超集,允许在OC中使用C语言代码,编译器兼容C语言程序

  具备完善的面向对象特性:封装继承多态

  包含一个运行时系统。

  类库丰富。

 2>OC与Swift

  Objective-CSwift虽然语法差异很大,但是背后的思想以及所依托的类库都是相同的。

3、类和对象的概念和区别

 1> 类:具有相同特征和行为的事物的抽象

 2> 对象:类的实例,万事万物皆是对象

4、类和对象的定义

 1> 类的定义

  面向对象的核心思想是类和对象

  OC中类的定义分为两个部分:接口部分实现部分

  接口部分:对外声明类的特征行为。(.h文件中)

  实现部分:行为的具体实现。(.m文件)

 2> 接口部分

1 #import 
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 和 init15         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

  ① idinstancetype都可以作为方法返回值类型,都表示任意类型对象

  ② instancetype可以返回和方法所在类相同对象,id只能返回未知的类型

      ③ instancetype只能作为方法的返回值参数类型id不仅可以作为返回值类型可以用来作为定义变量的类型

      ④ 在init方法中,idinstancetype作为返回值类型是没有区别

5、实例变量的可见度

 实例变量可见度分别是:@public@protected@private@package 

  @public 修饰的变量 在任何地方都可以直接访问对象的成员变量

  @private修饰的变量 只能在当前对象方法直接访问

  @protected修饰的变量 在当前子类方法中直接访问

  @package修饰的变量 只要处于同一个框架中就能直接访问对象的成员变量

 外界想要访问对象实例变量,实例变量需要通过@public修饰。

 在 .h 文件中实例变量没有指定可见度的情况下,默认@protected

 .m 文件中实例变量也可以被定义,可见度是 @private

 三种可见度的区别

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)weight10          address:(NSString *)address11        isMarried:(BOOL)isMarried;

方法名的确定请参考以上代码

6、setter和getter方法

 实例变量如果是受保护类型的,外界无法直接访问,外界如果要访问实例变量,需要本类提供方法,外界访问的话直接调用相应的方法即可  

 1> 外界操作实例变量通常对实例变量赋值取值操作

  setter方法:本类提供的用来给实例变量赋值的方法

  getter方法:本类提供的用来给实例变量取值的方法

 2> 方法命名

  setter方法:以set开头,后面跟上实例变量名(没有下划线)

  getter方法:实例变量名去掉下划线 _

以下是一个较完整的类定义的代码

Goddess.h

1 #import 
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 *)hoddy49 weight:(double)weight50 address:(NSString *)address51 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 *)hoddy47           weight:(double)weight48          address:(NSString *)address49        isMarried:(BOOL)isMarried {50     51     _hoddy = hoddy;52     _weight = weight;53     _address = address;54     _isMarried = isMarried;55 }56 57 @end

 

转载于:https://www.cnblogs.com/gfxxbk/p/5290834.html

你可能感兴趣的文章
我的友情链接
查看>>
MHA配置参数
查看>>
深入理解Lock
查看>>
vim的块选择
查看>>
HTML --块
查看>>
在DLL中获取主进程窗口句柄
查看>>
基于消息队列的双向通信
查看>>
一个不错的loading效果
查看>>
Debian允许root用户登录
查看>>
linux的文件系统
查看>>
上云利器,K8S应用编排设计器之快到极致
查看>>
袋鼠云服务案例系列 | 从DB2到MySQL,某传统金融平台的互联网转型之路
查看>>
RealServer配置脚本
查看>>
九月份技术指标 华为交换机的简单配置
查看>>
python 写json格式字符串到文件
查看>>
分布式文件系统MogileFS
查看>>
电力线通信载波模块
查看>>
linux vim详解
查看>>
Java23种设计模式案例:策略模式(strategy)
查看>>
XML解析之DOM4J
查看>>