zoukankan      html  css  js  c++  java
  • Effective Objective-C 2.0 — 第七条:在对象内部尽量直接访问实例变量

    直接访问实例变量,不经过”方法派发“(method dispatch) 速度快。

    直接访问实例变量,不会调用其“设置方法”,这就绕过了为相关属性所定义的“内存管理语义”。

    直接访问实例变量,不会触发“键值观测”(Key-Value Observing, KVO)通知。

        (KVO,一种通知机制,当某对象属性改变时,可通知其他对象。)

    通过属性来访问有助于排查与之相关的错误,因为可以给“获取方法” or、and “设置方法” 中新增断点(breakpoint),监控该属性的调用者及其访问时机。

    优化方案: 在对象内部读取数据时,应该通过实例变量来读,而写入数据时,则应通过属性(即setter方法)来写入。

    在初始化方法及dealloc方法中,总是应该直接通过实例变量 来书写数据。

    使用惰性初始化技术配置某份数据,需要通过属性来读取数据。

    @interface EOCPerson : NSObject
    @property (nonatomic, copy) NSString *firstName;
    @property (nonatomic, copy) NSString *lastName;
    
    - (NSString *)fullName;
    - (void)setFullName:(NSString *) fullName;
    @end
    
    //实现方法
    // 使用“点语法”,获取方法
    - (NSString *)fullName
    {
        return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName];
    }
    //设置方法
    - (void) setFullName:(NSString *)fullName
    {
        NSArray *components = [fullName componentsSeparatedByStirng:@" "];
        self.firstName = [components objectAtIndex:0];
        self.lastName = [components objectAtIndex:1];
    }
    
    //如果不经由存取方法,而是直接访问实例变量
    - (NSString *) fullName
    {
        return [NSStringstringWithFormat:@"%@ %@", _firstName, _lastName];
    }
    - (void) setFullName:(NSString *)fullName
    {
        NSArray *components = [fullName componentsSeparatedByStirng:@" "];
        _firstName = [components objectAtIndex:0];
        _lastName = [components objectAtIndex:1];
    }
  • 相关阅读:
    把Asp.net Core程序代码部署到Ubuntu(不含数据库)
    2019周笔记(3.11-3.16)
    利用StackExchange.Redis和Log4Net构建日志队列
    Windows环境下安装配置Mosquitto服务及入门操作介绍
    2019周笔记(2.25-3.01)(压缩数据库)
    2019周笔记(2.18-2.23)
    WinForm客户端限速下载(C#限速下载)
    2019周笔记(2.14-2.17)(聚集索引、非聚集索引)
    高并发场景下秒杀项目静态锁的使用疑问
    线性结构队列以及应用(上)
  • 原文地址:https://www.cnblogs.com/IDRI/p/5032225.html
Copyright © 2011-2022 走看看