美文网首页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