zoukankan      html  css  js  c++  java
  • iOS学习10之OC类和对象

    本次是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 <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

      ① 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)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
  • 相关阅读:
    放弃antd table,基于React手写一个虚拟滚动的表格
    思考:声明式编程与命令式编程
    前端入门指南(菜鸟篇-下)
    前端入门指南(菜鸟篇-上)
    centos7 磁盘管理—— lvm的使用
    Linux 用 sftp scp命令 互传文件
    linux 通过md5查找重复文件
    Linux sort uniq 命令。简单运用
    Linux sed 命令
    shell 脚本,将/etc/目录下所有的软链接文件输出
  • 原文地址:https://www.cnblogs.com/gfxxbk/p/5290834.html
Copyright © 2011-2022 走看看