美文网首页iOS DeveloperiOS学习开发
ios开发 - oc代码质量提高(一)

ios开发 - oc代码质量提高(一)

作者: tigerAndBull | 来源:发表于2018-09-09 04:56 被阅读114次

    前言:

    本文主要针对ios开发的菜鸟,进行基础知识梳理和代码质量提高。或许对某些知识点理解的不够全面,也可以进行开发,但是我相信,对于技术有追求的童鞋,对自己的代码质量有一定的要求。

    涉及到的知识点:

    • 点语法你不知道的秘密
    • 属性变量相关:@property的前世今生 以及
                               @synthesize@dynamic的作用
    • 成员变量相关:@private,@protected,@package,@public和箭头符号
    1.点语法

    基础用法:oc中的点语法是编译器的特性,编译器会根据语境调用getter/setter方法。
    其实,这只是针对属性的一种用法,
    当点语法作为getter的语境下,可以调用所有无参函数

    应用场景:假设有一个头视图,加载完成后是不需要改变的

    使用方法:

    下面这仅仅是一个无参函数,没有定义其他属性

    - (UIView *)headView {
        
        UIView *v = [[UIView alloc]initWithFrame:CGRectMake(20, 100, 200, 40)];
        v.backgroundColor = [UIColor blackColor];
        return v;
    }
    
    /**
     initialize view
     视图初始化
     */
    - (void)initUI {
        
        [self.view addSubview:self.headView];
    }
    

    写法好处:

    • 成块分离出来,容易阅读。
    • 同时不需要再定义一个headView变量,同时因为addSubview的强引用,view会存放在堆空间,不会被释放掉。
    2.成员变量和属性变量
    @interface ViewController () {
        UIView *memberView; //成员变量
    }
    
    @property (nonatomic,strong) UIView *attributeView; //属性变量
    
    @end
    
    属性变量
    1. @dynamic:动态绑定一个属性的实现,通俗的讲,就是告诉编译器,属性的setter/getter方法由用户自己实现,不自动生成。

    关于动态绑定解释:
    假如有个变量student,你声明了@dynamic student;
    然后你还没有实现setter和getter方法
    当程序运行student.age = 10;时才会崩溃,编译时是没有问题的

    1. @synthesize:如果你没有手动实现getter/setter方法,那么编译器会自动为你加上这两个方法,同时生成对应名称的私有的成员变量,私有保证子类不持有改变量。
      同时@synthesize来修改实例变量的名字
    @synthesize attributeView = 未定义过的变量名;
    @synthesize attributeView; //同样可以
    @synthesize attributeView = attributeView;  //效果同上,更易阅读
    

    3.ARC下的@property

    • 自动生成 @sythesize 变量名 = _变量名;
    • 对应的属性修饰符会在后面博客整理

    相信阅读到这里,平时使用的@property就能理解一些了。

    成员变量

    箭头符号:用于访问成员变量
    四种修饰符
    @private:私有的,类内部可以访问
    @protected:受保护的,类内部和子类可以访问
    @package:可以被同一包中的类访问
    @public:公开的,可以被所有的类访问

    特别声明:

    • 在.h文件中用@public修饰的变量,可以用->被外部访问
      但在.m文件中用@public修饰的变量,不可以!
    • 默认是用@protected修饰
    • 上面提到 @synthesize 生成的成员变量是@private修饰的,很显然,子类是无法继承的,后面会用runtime讲解具体细节的。

    结论:

    • 不需要实现getter/setter的变量,建议直接定义成员变量
    • 需要对getter/setter方法进行额外操作的,用@dynamic主动告诉编译器,当然不用主动告诉编译器(省事),也没毛病,程序员写的getter/setter方法具有最高优先级
    • 如果使用懒加载的风格,建议使用点语法糖
    • 提醒:在此理解了本文基础之上,应该不会犯循环引用的低级错误了,还有本文强调的是不要让编译器做用不着的事情

    以上仅为个人理解,如有问题,欢迎指出,谢谢!
    有其他问题,联系qq:1429299849

    相关文章

      网友评论

      • BryantHe:"同时因为addSubview的强引用,view会存放在堆空间,不会被释放掉。"
        请问这句如何理解呢?
        tigerAndBull:@何玉龙 主要是作用域的问题,防止view被释放掉

      本文标题:ios开发 - oc代码质量提高(一)

      本文链接:https://www.haomeiwen.com/subject/bnzlgftx.html