zoukankan      html  css  js  c++  java
  • Objective-C 浅谈

    内存泄露
        Leaked memory
        Abandoned memory
        Cached memory
        NSURLSession内存泄露
            https://shenfh.github.io/2017/07/28/sessionleak/
        
    
    block导致的循环引用
        block中调用对象成员时,会隐藏的将对象引用计数加一
        解决方法:
            1. 对对象进行弱引用
            2. block调用结束后,将所有该block的指针置为nil
        http://www.cnblogs.com/gongyuhonglou/p/7027223.html
    
    
    autorelease与返回值
        返回值分为ratained和unretained两种,后者会在失效后直接释放,前者回延迟释放
        延迟释放使用的手段是,通过将对象加入到autorelease中,从而延长返回值的生命周期
    
    
    runloop
        https://blog.ibireme.com/2015/05/18/runloop/    

    Objective-C 与 C

      OC 在 C 的基础上添加了面向对象的特性,同时 OC 也是一种真正的动态语言。

      1.1 messaging structure 和 function calling

        C (function calling) : object->perform(param1, param2);

        OC (messaging structure) : [object performWith:param1 and:param2];

        在 messaging structure 中:

          object 被称为 “receiver”

          perform:and: 被称为 “selector”

          “selector” 以及 param1 与 param2 合起来被称为 “message”

      1.2 静态与动态

        C 是一种静态语言,所以函数调用(function calling)中调用的代码在编译的时候就已经被决定了。

        不过也有例外,C 有一种特性叫“动态绑定”,当调用的函数出现“多态”时,那么程序只有在运行的时候去定位需要执行的代码了。

          void func1();

          void func2();

          void test(bool flag)

          {

            void (*f)();

            if (flag) f = func1; // func1();

            else f = func2; // func2();

            f();

          }

        上面这个例子中,就应用到了“动态绑定”的特性。

        OC 是一种真正的动态语言(相较于java C++这些来说),其在运行时所执行的代码是由"OC runtime"决定的。当“receiver”接收到“message”之后,其究竟要调用哪个方法完全于运行期决定,有时甚至可以在运行时改变要执行的方法(比如“method swizzling”--常用于黑盒调试)。

        在编译器发现以 messaging structure 为原型的代码之后,会将其转换为标准的 function calling (通常以名为“objc_msgSend”的函数进行封装)。在程序运行期间,“objc_msgSend”会去寻找执行消息所需要的方法,寻找过程先后分为两步:查找“方法列表”和执行“消息转发”。

        由于动态语言在程序执行期间所遇到的复杂的查找过程,OC 设计了一种缓存机制,即为每一个类都分配一块缓存区,缓存区中保存之前匹配成功的“消息-方法”的映射。

      1.3 heap 和 stack

        C 通常将变量存储在栈区,而 OC 中所有的对象都必须被分配在堆上。

          Object *obj = [Object new];

          Object obj = [Object new];

        基于 OC 这样特殊的内存管理特性,在 OC 中声明一个对象都是以指针的形式进行,如果出现第二个情况就会报错“interface cannot be statically allocated”。

        尽管 OC 中的对象被存储在堆上,但是开发者并不需要执行复杂的内存管理工作。OC 提供了名为 ARC(Automic Reference Counting) 的内存管理机制。通过 ARC 开发者几乎可以把所有内存管理的工作都交给编译器。

    property

      2.1 access method

        property 供了一种简洁的抽象机制来封装类的实例变量--access method。

        在 C++或者JAVA中,一个类的定义通常如下:

        class Object {

        public:

          int member1;

        private:

          int member2;

        }

        访问 member1 我们可以直接通过类的实例 object.member1 来访问;而访问 member2 我们只能通过在 Object 中添加 setter和geeter 来访问。

        access method 这一机制则可以自动生成实例变量的 getter 和 setter 方法。

      2.2 property 的属性特质

        property 声明的成员变量可以配置四中类型的特质:原子性、读写权限、内存管理、自定义 access method

          @property (nonatomic, readonly, copy, getter=isBFlag) BOOL bFlag;

      2.3 类内部访问 property

        默认的,OC 会在实例内部为每个 property 生成一个以 "_" 开头的变量,如 _bFlag。当然也可以通过 @synthesize 重新命名变量。

        在类内部应该尽可能的直接访问 property 变量,而不是使用 access method,这样做的好处好多:

          直接访问内存,加快存取速度

          绕过了"内存管理"的定义,不受其影响

          绕过了 KVO (key-value observing)的检测

    protocol 与 category

      3.1 protocol

        protocol 类似 JAVA 中的 interface,其最常见的用途是实现"委托模式"。

        在 OC 中常见以 Delegate 结尾的定义,通过 Delegate 一个类可以要求被委托类实现一些必要的接口供着急调用。

      3.2 category

        category 是一种与 protocol 相比的反向操作,它能够向包含自己的类中添加新的方法。

        基于 category 的特性,可以将一个类的功能分散到多个分类中,以便于管理。

        @interface TransLayerProtocol : NSObject

          @property TCPProtocol tcpProto;

          @property UDPProtocol udpProto;

        - (void) goTcpProto;

        - (void) goUdpProto;      

        @end

        可以将 TransLayerProtocol 这个类(存于TransLayerProtocol.h/.m文件中)拆分为 TransLayerProtocol+TCP(TransLayerProtocol+TCP.h/.m)和TransLayerProtocol+UDP(TransLayerProtocol+UDP.h/.m)两个文件。

  • 相关阅读:
    [bzoj1613 Usaco2007 Jan]Running贝茜的晨练计划
    [bzoj1600][Usaco2008 Oct]建造栅栏
    [bzoj3208]花神的秒题计划I
    [vijos1011]滑雪
    [noip2007 pjt3] 守望者的逃离
    DP(1) 背包
    快速幂 模板及应用
    BZOJ1303: [CQOI2009]中位数图
    BZOJ1083: [SCOI2005]繁忙的都市
    Bzoj1084: [SCOI2005]最大子矩阵
  • 原文地址:https://www.cnblogs.com/shaellancelot/p/6703676.html
Copyright © 2011-2022 走看看