前言:
本文主要针对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
属性变量
- @dynamic:动态绑定一个属性的实现,通俗的讲,就是告诉编译器,属性的setter/getter方法由用户自己实现,不自动生成。
关于
动态绑定
解释:
假如有个变量student,你声明了@dynamic student;
然后你还没有实现setter和getter方法
当程序运行student.age = 10;时才会崩溃,编译时是没有问题的
- @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
网友评论
请问这句如何理解呢?