结合之前的学习笔记以及参考《Objective-C编程全解(第三版)》,对Objective-C知识点进行梳理总结。知识点一直在变,只是作为参考,以苹果官方文档为准~
四、属性声明与功能
1、点语法
a、本质:方法调用(不是访问成员变量)
b、原理:是一种编译器行为,使用时,编译器会自动进行转换,来判断调用set方法还是get方法
操作 | 点语法 | 使用消息表达式 |
---|---|---|
setter | obj.name = val; |
[obj setName:val]; |
getter | val = obj.name; |
val = [obj name]; |
c、使用注意:
(1)必须已定义set和get方法才能使用点语法(属性可读写或可读,不能只写)
(2)不能对id类型的变量应用点语法,编译器无法判断是否存在属性对应的访问方法
(3)避免死循环(例如在set方法中用self调用自身等等)
(4)复杂点操作解释如下:
e = obj.depth++;
右侧相当于连续调用了getter和setter方法,相当于执行了
[obj setDepth:[obj depth]+1];
最后赋值给e的是递增操作前的depth值。
2、属性声明与实现(@property和@synthesize)
—->Xcode 4.4之前:
@property用在@interface中,自动生成set和get方法的声明;
@property int age; //等同于下列声明
- (void)setAge:(int) age;
- (int)age;
@synthesize用在@implementation中,自动生成set和get方法的实现;
@synthesize age = _age; //等同于上述方法的实现
苹果官方推荐的是“_”开头的成员变量命名
因此编译器默认去访问_age,如果不存在,编译器会自动生成@private的成员变量_age
—->Xcode 4.4之后新特征:@property可自动生成set和get方法的声明和实现,包含了@synthesize的功能
注意:若手动实现了setter/getter方法,则编译器只会生成getter/setter方法;
若都实现了,编译器不会生成不存在的成员变量
3、实例变量的作用域(可见性)
修饰符 | 类内部 | 子类 | 任何地方 |
---|---|---|---|
@private | o | x | x |
@protected | o | o | x |
@public | o | o | o |
说明:
(1)在@interface中,未声明属性的成员变量默认为@protected;
(2)在@implementation中也可以声明成员变量,但默认为@private,即使设成@public也没用(最好不要这么做);
(3)@interface中和@implementation中声明的成员变量不可同名。
(4)@package,在同一框架中,可以跟@public一样访问,而在框架外则同@private一样。
4、属性指定选项
a、@property与内存管理有关的参数MRC
assign(默认):直接复制,适用于非OC对象类型
retain:自动生成带内存管理的release旧值,retain新值的set方法(具体实现方法在后面整理内存管理的时候会提到)
copy:自动生成带内存管理的set方法,release旧值,copy新值,会创建新的实现对象,原对象引用计数器不变,新对象引用计数器为1
b、控制是否生成set方法
readwrite(默认):同时生成set方法和get方法的声明和实现
readonly:仅生成get方法的声明和实现
c、控制set方法的多线程管理
atomic(默认):自动不过生成set方法时多线程加锁(互斥锁),性能低,耗性能
nonatomic:禁止多线程加锁,性能好,//如无特殊需求使用此参数
d、指定方法名
setter = setter方法名:注意setter名称后面要加冒号:
getter = getter方法名
例如:
@property (setter = setValue:) int age;
此情况下运用点语法调用 .age 时,实际上启用的方法是setValue:
5、在ARC条件下参数的修改
strong:成员变量为强指针,相当于MRC中的retain,适用于OC对象类型
weak:成员变量为弱指针,弱引用,相当于MRC中的assign,适用于OC对象类型
unsafe_unretained:同assign(MRC)一样
上述内容已经涉及内存管理,在之后的知识点总结中会将内存管理作为一个篇章总结~