Objective-C(四、属性声明与功能,点语法)——iOS开发基础

来源:互联网 发布:乐高编程软件手机 编辑:程序博客网 时间:2024/06/06 07:12

结合之前的学习笔记以及参考《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)一样

上述内容已经涉及内存管理,在之后的知识点总结中会将内存管理作为一个篇章总结~

0 0
原创粉丝点击