Skip to content

ARC与MRC(内存管理)

qingkong1998 edited this page Sep 12, 2018 · 2 revisions

【掌握】ARC 与 MRC

MRC项目 转 ARC项目

  • Edit -> Refactor-> Convert to Objective-C ARC

MRC 与 ARC 共存

  • 选中项目跟节点 -> 选中target -> Build Phases->Compile Sources (1 item) ->在需要设置为不使用ARC文件所在的行与complier Flags的列 的交汇处双击,写上命令 -fno-objc-arc

【掌握】分类

【掌握】作用:扩充原有类的功能

【掌握】 定义

  • 名称:原有类的名称 (分类名称)
  • 文件名称:原有类的名称 + 分类名称

【了解】优点

  • 代码模块化
  • 团队协作
  • 可以扩充系统自带类的功能

【掌握】使用

  • 在分类中可以声明和实现新的方法
  • 在分类的方法中可以访问原有类的成员变量

【掌握】练习

  • 给NSString类增加一个计算字符串中有多少数字的功能
  • 给NSObject方法增加一个run方法
    • 给NSObject扩展分类,应该非常谨慎,因为他会作用到所的类上面

【掌握】注意点

  • 分类只能扩充功能不能扩充属性
  • 在分类使用@property 只能生成方法的声明,不能生成方法的实现,更不能生成成员变量
  • 分类中不能有与原来类同名的方法,不同分类中也不能有同名的方法
  • 【理解】如果分类中如果存在与原来类中的同名函数,那么分类中的方法会覆盖原有类中的方法(哪怕你没有导入这个分类)
  • 【理解】如果多个分类中有相同的方法,最后将使用最后编译的那个分类中的方法

【掌握】类扩展

用在.m文件中,给类增加私有的成员变量和方法

类扩展中小括号中没有内容

【掌握】SEL

概念【掌握】

  • 它是一种代表着方法的签名数据类型,我们也成为它使一个选择器

使用

  • 【掌握】定义普通的变量
  • 【理解】作为方法实参
    • 与NSObject 相关方法配合使用
      • 【掌握】判断一个对象是否实现了某个方法
        • respondsToSelector:(SEL)
      • [了解]执行对象上某个的方法
        • performSelector:(SEL)
        • performSelector:(SEL) withObject:(id)
        • performSelector:(SEL) withObject:(id) withObject:(id)
      • 【了解】延迟执行某个对象上的方法
        • performSelector:(SEL) withObject:(id) afterDelay:(NSTimeInterval)]
  • [了解] 方法形参
    • makeObject:(id) performSelector:(SEL)
  • 【了解】作为方法的返回值

【了解】OC中的方法调用过程

【掌握】block

【掌握】作用:封装代码

【掌握】优点:消除了函数不能能定义在方法内部的缺点,使用起来更加灵活

【理解】使用

  • 【掌握】定义变量
    • 返回值类型 (^变量名称) (形参列表)
  • 【掌握】定义功能
    • ^返回值类型 (形参列表)
      • 无参无返回值
        • ^{ 语句... };
      • 有参无返回值
        • ^(参数列表){语句...}
      • 有参有返回值
        • ^(参数列表){语句...}
  • 【掌握】作为函数参数
    • 返回值类型(^)(形参列表)
    • 技巧:参数列表中写上参数的名称,方便以后使用
  • 【理解】typedef 来定义类型
    • typedef 返回值类型 (^block类型名称) (形参列表)

【理解】使用场景

  • 程序员的一天
  • 当一个方法中前面一部分是确定的后面一部分也是确定的,只有中间一部分经常变化,那么中间的这部分就可以提取成为一个block

【掌握】注意点

  • block内部不可以改变局部变量的值
  • 若想改变局部变量值,就需要使用__block 来修饰这个变量

【掌握】协议

【掌握】概念:两个或两个以上对象之间约定

【掌握】定义

  • @protocol 协议名称

    //声明方法

    @end

    • 中间只写方法声明
    • 需要遵守协议NSObject
    • @protocol 开头以 @end 结尾
  • 一个协议也可以遵守多个协议

    • @protocol 协议名称 <协议1**,协议2,协议3 ...**>

      //声明方法

      @end

【掌握】协议的基本使用

  • 第一步:定义协议
  • 第二步:遵守协议
    • 在声明类的时候,在类名后面的通过<协议名称>来遵守协议
      • @interface 类名 : 父类名称 <协议>

        @end

    • 在类扩展中遵守协议
      • @interface 类名() <协议>

        @end

  • 第三步:实现协议中的方法
  • 【掌握】注意点
    • 一个类可以遵守多个协议中间以逗号隔开
      • @interface 类名 : 父类名称 <协议1,协议2,协议3...>

        @end

【掌握】id 类型与协议

  • id<协议名称> 变量名称
    • 通过这种方式定义出来的指针变量,只能指向遵循了该协议的对象
    • 通过这方式定义出来的指针变量,可以指向遵循该协议的任意对象

【掌握】两个关键字

  • @required
    • 表示遵守该协议的类必须要实现的方法
  • @optional
    • 表示遵守协议的类可以选择实现的方法

【掌握】代理设计模式

使用场景

  • 当A类对象发生了什么事,想通知B类对象的时候(让B类对象成为A类对象的代理)
  • 当A类对象有些事情,自己无法处理,需要B类对象帮助它处理( 让B类对象成为A类对象的代理)
  • 当B类对象想要监听A类对象中发生的事情的时候(让B类对象成为A类对象的代理)

实现步骤

  • A类中定义协议
    • 该协议名称为ADelegate,其中声明一些希望B类实现的方法
  • A类中添加一个类型 id delegate的属性
  • A类中当发生了什么事的时候,调用delegate相应的方法
    • 注意在调用这个方法之前首先要判断delegate是否确实实现了这个方法,只有delegate实现这个方法才能调用这个方法
  • B类遵守ADelegate的协议
    • @interface B() <ADelegate>

      @end

  • B类中实现ADelegate协议中声明的方法
    • 注意:这里实现的方法可以是某一个或某几个或是全部,取决B对象希望监听A对象的什么事件
  • 将B类对象赋值给A类对象的delegate属性

使用场景

  • 婴儿与保姆
    • 婴儿想吃了要通知保姆,让保姆成为婴儿代理
    • 保姆想知道婴儿什么时候想吃了,让保姆成为婴儿的代理
    • 婴儿自己不会吃,需要保姆帮忙,让保姆成为婴儿的代理

ios开发技术

Clone this wiki locally