最近在看即将要加入的项目的代码,看到一个protocol里包含着几个property。之前没有写过类似的代码,看到这里的时候,突然疑惑了一下,发现自己对property的理解好像有点模糊。所以回家后又看了看文档,觉得的确涨了点姿势,所以要记下来~


声明accessor methods

官方文档对property的定义是:

A declared property provides a syntactical shorthand for declaring a class’s accessor methods and, optionally, implementing them.

所以说,声明一个property,实际上等于声明了对应的accessor方法。

对于readwrite的property来说,编译器为它声明了getter方法和setter方法;而对于readonly的property来说,编译器只为它声明了getter方法。
所以,如果想要对readonly的property发送setter消息,编译器就会报错。


合成accessor方法和实例变量

除了声明对应的accessor方法,程序员也可以指示编译器合成accessor方法的实现。

比如,在一个类的implementation block中,使用类似这样的@synthesize语句:

@synthesize firstName = _firstVar;

编译器就会合成firstName这个property的accessor方法的实现和一个叫做_firstVar实例变量

如果只是这样写@synthesize语句:

@synthesize firstName;

那么编译器合成的实例变量的名称也叫firstName


Default Synthesis

从Xcode 4.4和LLVM Compiler 4.0开始,编译器会默认为property合成accessor方法和实例变量,这样程序员就可以不用自己写@synthesize语句了。合成的实例变量的命名规则大概像是这样:

@synthesize firstName = _firstName;

也就是说,合成的实例变量的名字,是property名字前加上了一条下划线。

但是也有一些比较特殊的情况:

  1. 自定义了getter和setter方法的readwrite property
    编译器是不会为这样的property生成默认的实例变量的。如果程序员需要,就得自己添加对应的@synthesize语句了。

  2. 自定义了getter方法的readonly property
    和上面一种情况类似,编译器不会为这样的property生成默认的实例变量。因为这个property是readonly的,编译器自然也不会为它声明和合成setter方法。

  3. Protocol中声明的property
    对于protocol中声明的property,default synthesis是不会作用的。所以,所有实现了这个protocol的类都需要自定义或者用@synthesize语句合成accessor方法和实例变量。

  4. 对于atomic property,不建议自定义getter和setter的其中一个


@dynamic

有的时候,程序员可能想要动态的提供对某个方法的实现。如果希望对property的accessor方法提供动态的实现,就可以使用@dynamic语句。

@dynamic firstName;

这指示了编译器,和这个property有关的方法会动态的提供,这时,即便编译器找不到这个property对应的accessor方法的实现,它也不会报出warning。


关于property的建议

苹果建议,在一般情况下尽量使用accessor方法来访问一个property,而不是直接访问它对应的实例变量。但是在一个对象的init方法deallocate方法自定义的accessor方法中不建议调用accessor方法。


作者:卖萌凉
链接:https://www.jianshu.com/p/455ec3aff322
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

对OC中property的一点理解的更多相关文章

  1. OC中@property属性关键字的使用(assign/weak/strong/copy)

    OC中@property属性关键字的使用(assign/weak/strong/copy) 一.assign 用于 ‘基本数据类型’.‘枚举’.‘结构体’ 等非OC对象类型 eg:int.bool等 ...

  2. OC中property方法的使用

    我们直入主题,关于property方法,我们先来了解一下相关的知识,首先是成员变量,实例变量,属性变量. 我们定义一个类来看一下 @interface Person :NSObject{ NSInte ...

  3. [OC笔记]@property之个人理解,大神轻拍

    /** * 一个简单的对象 * * @author suzhen * */ public class SimpleObjcet { /** * 声明一个age字段 */ private Object ...

  4. [转] iOS (OC) 中 KVC 与 KVO 理解

    转自: http://magicalboy.com/kvc_and_kvo/ KVC 与 KVO 是 Objective C 的关键概念,个人认为必须理解的东西,下面是实例讲解. Key-Value ...

  5. OC 中property的使用

    property在使用的时候需要在其前面加上@符号,需要将其写在类的头文件中 当在定义一个对象的属性变量时,例如定义一个Person类中的name属性,可定义为: @property (nonatom ...

  6. OC中property的有关属性

    property的有关属性: (1)readwrite是可读可写特征:需要生成getter方法和setter方法: (2)readonly是只读特性只会生成getter方法不会生成setter方法: ...

  7. Java中try-catch-finally的一点理解

    在只有try-catch语句中,如果catch块中出现了return语句或者抛出了异常,那么catch之后的语句是执行不到的:但是如果将代码放入finally中,即使catch中出现了return语句 ...

  8. Linux中FTP的一点理解

    FTP(File Transfer Protocol)是一个非常古老并且应用十分广泛的文件传输协议,FTP协议是现今使用最为广泛的网络文件共享协议之一,我们现在也一直有在用着FTP协议来进行各种文件的 ...

  9. vue中mixin的一点理解

    vue中提供了一种混合机制--mixins,用来更高效的实现组件内容的复用.最开始我一度认为这个和组件好像没啥区别..后来发现错了.下面我们来看看mixins和普通情况下引入组件有什么区别?     ...

随机推荐

  1. @dynamic与@synthesize的差别

    如今非常多时候我们都已经不再使用@synthesizekeyword了,可是须要了解当中的原理: 一.@dynamic与@synthesize的差别 @property有两个相应的词.一个是@synt ...

  2. 在openwrt上编译一个最简单的ipk包

    1 什么是opkg Opkg 是一个轻量快速的套件管理系统,目前已成为 Opensource 界嵌入式系统标准.常用于路由.交换机等嵌入式设备中,用来管理软件包的安装升级与下载. opkg updat ...

  3. angular4(1)angular脚手架

    angular2之后有了类似于vue-cli的脚手架工具,很方便的帮助我们搭建项目: 1.安装angular命令行工具:npm install @angular/cli -g 2.检测angular- ...

  4. 解决Mysql报错:PHP Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using the old insecure authentication.

    最近我更新了appserv-win32-2.5.10的 PHP 5.2版本到PHP 5.3,在调用http://localhost/phpMyAdmin/时,出现如下错误:PHP Warning:   ...

  5. 「JavaSE 重新出发」02.02 引用数据类型

    引用(复合)数据类型 1. 枚举类型 例: 枚举类型 Size 的声明: enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 声明 Size 类型变量: ...

  6. c#学习0217

    1 继承 继承 1 子类是否继承了父类的构造函数 答案:子类并没有继承父类的构造函数 但是子类或默认调用父类的无参数的构造函数 在子类中创建父类对象 这样子类才可以使用父类的成员 如果在父类中声明了有 ...

  7. [Java] Protect, Private and Public的区别

    Java中的private.protected.public和default的区别 (2014-03-21 22:29:14) 转载▼ 标签: java java修饰符 it   (1)对于publi ...

  8. python基础9 (迭代器、生成器)

    1.可迭代对象 迭代:将某个数据集内的数据“一个挨着一个的取出来” 可迭代协议:可以被迭代要满足的要求,即内部含有__iter__()方法 可迭代的类型:字符串.列表.元组.字典.集合特点:惰性运算 ...

  9. caioj 1204 Catalan数(模板)

    题目中对卡特兰数的总结很不错 以下copy自题目 Catalan数列:1,1,2,5,14,42,(前面几个要背) 即 h(0)=1,h(1)=1,h(2)=2,h(3)=5...公式:h(n)=C( ...

  10. 紫书 例题 10-4 UVa 10791(唯一分解定理)

    首先分解,然后可以发现同一个因子ai不能存在于两个以上的数中 因为求的是最小公倍数,如果有的话就可以约掉 所以数字必然由ai的pi次方的乘积组成,那么显然,在 a最小为2,而b大于2的情况下a*b&g ...