Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。在学习OC中属性之前我们先要知道为什么要为变量实现getter和setter方法,我们先来了解一下实例的作用域。

实例变量的作用域如下:

1. @public : 共有的,该实例变量谁都可以访问;

2.@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中是private的默认是protected;

3.@private: 私有的,该实例变量只能在该类的内部访问;

因为要用protected 或者 private来隐藏类的内部细节,用类或者对象是没法直接访问被隐藏的细节的,所以要用getter和setter来访问被隐藏的实例变量,OC中的属性机制就为我们提供了默认的getter和setter方法。下面我们要学习一下OC中的属性机制。

属性的定义和实现

1.属性的定义

属性的定义用编译器命令@property来定义,比如要为私有的变量 int a;定义getter和setter方法,@property int a;  用@property会自动的为修饰的变量加上

getter和setter方法。

Demo如下:

1
2
3
4
5
6
7
8
9
10
11
@interface Student : NSObject
{
    NSString *name;
    int idNumber;
}
//定义属性
@property NSString *name;
@property int idNumber;
//定义其他方法
@end

2.属性的实现

在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。用@synthesize也可以给函数改名用@synthesize name = otherName; 就可以给方法改名。

demo如下

1
2
3
4
@implementation Student
 @synthesize name, idNumber;
    //其他方法的实现
@end

​    ​3.定义后属性的使用

​    ​在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样

1
2
3
4
//调用name的setter方法
[student setName : @"ludashi"];
//调用name的getter方法
NSString *name = [student name];

​    ​getter和setter方法也可以用点语法来实现

1
2
3
4
5
//name的setter方法也可以这样写
student.name  =  @“ludashi”;
//name的getter方法也可以这样写
NSString *name = student.name;

​     ​    上面调用getter和setter方法的方式看着想是直接操作类的属性,其实不然,也是通过方法来操作的。

​4.property有关的语法

​    ​1.自定义存取方法名

​    ​    ​系统默认的存方法是setPropertyName, 默认的取方法是propertyName。可以用以下方式来更改setter和getter方法的名字

​    ​    ​(1)用getter = getterName来指定getter自定义的名称

​    ​    ​    ​    ​demo:  @property (getter = getterName) NSString *name;

​    ​    ​(2)用setter = setterName来指定setter自定义方法的名称

​    ​    ​    ​    ​demo: @property (setter = setterName) NSString *name;

​    ​2. property的可读写性

​    ​    ​property的可读写性决定属性是否有setter方法

​    ​    ​(1)readwrite : 指定属性是可读写的,这是默认值,因此可以省略

​    ​    ​    ​    ​  @property (readwrite) NSString *name;

​    ​    ​  (2) readonly : 指明属性是只读的。系统不会setter方法,但有getter方法

​    ​    ​    ​    ​  @property (readonly) NSString *name;

​   3.用于setter中的语义 :决定了以何种方式对数据成员赋予新值

    strong : 表示强引用关系,即拥有对象的所有权。

    weak : 表示弱引用,不拥有对象的所有权,当目标对象被销毁之后,属性值会被自动设为nil;

​    ​    ​assign(赋值): 直接赋值,计数器不会加一,简单的赋值方法,默认赋值方式,适合基本数据类型

​    ​    ​copy(拷贝):把原来的对象拷贝过来,计数器会加一,比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02;

​    ​    ​retain(保留):这种方式传递的是指针,原有的对象和被赋值的对象的地址是一样的

​    ​

​   4.原子操作

​    ​    ​    ​atomic: 线程安全的;

​    ​    ​    ​nonatomic: 线程不安全的;

  我们可以简写属性,直接在接口文件中吧{}省略掉,直接用@property来定义方法,省去实现文件中的@synthesize, 访问属性时用_propertyName, 给属性赋值时用self.propertyName

Objective-C中的属性机制相关推荐

  1. Struts2中的ModelDriven机制及其运用、refreshModelBeforeResult属性解决的问题

    Struts2中的ModelDriven机制及其运用.refreshModelBeforeResult属性解决的问题 参考文章: (1)Struts2中的ModelDriven机制及其运用.refre ...

  2. 【反射机制】Java中的反射机制,使用反射机制创建对象、访问属性、方法、构造方法等

    这篇文章主要是整理了Java中的反射机制,包括:反射机制概念.反射机制访问构造方法.反射机制访问普通方法.反射机制访问属性,反射机制访问修饰符. 目录 一.反射机制概念 二.反射机制使用 (1)加载C ...

  3. 「前端面试题系列7」Javascript 中的事件机制(从原生到框架)

    前言 这是前端面试题系列的第 7 篇,你可能错过了前面的篇章,可以在这里找到: 理解函数的柯里化 ES6 中箭头函数的用法 this 的原理以及用法 伪类与伪元素的区别及实战 如何实现一个圣杯布局? ...

  4. VC++在对话框中加入属性页

    当一个基于对话框的程序中有相当多的控件时,你一定会想到使用属性页来将这些控件分类放置.本文针对这种方法来讨论几种可能实现的方案. 方案一 本方案的例子请见源代码打包文件中的Property1部分 在对 ...

  5. 浅说Java中的反射机制(一)

    在学习传智播客李勇老师的JDBC系列时,会出现反射的概念,由于又是第一次见,不免感到陌生.所以再次在博客园找到一篇文章,先记录如下: 引用自java中的反射机制,作者bingoideas.(()为我手 ...

  6. 【转载】在对话框中加入属性页

    原文地址:http://www.vckbase.com/document/viewdoc/?id=398 在对话框中加入属性页 作者:黄晨量 下载本文全部源代码 当一个基于对话框的程序中有相当多的控件 ...

  7. Hibernate 中配置属性详解(hibernate.properties)

    转自:https://blog.csdn.net/shudaqi2010/article/details/70324843 Hibernate能在各种不同环境下工作而设计的, 因此存在着大量的配置参数 ...

  8. html的meta总结,html标签中meta属性使用介绍和   动态替换字符串

    http://www.haorooms.com/post/html_meta_ds http://www.haorooms.com/archives里面的东西比较多,需要细看一下 http://www ...

  9. 利用tab_control控件在对话框中加入属性页的方法详细介绍

    在对话框中加入属性页 方案一 在对话框上放置一个Tab Control的控件,再在对话框上放置所需的控件(本例放置了2个按钮,试图在每个标签中显示一个).然后利用Class Wizard来为Tab C ...

最新文章

  1. Json返回结果为null属性不显示解决方法
  2. 在django中区分null = True,空白= True
  3. 数据结构面试的常客,一文带你深入了解堆
  4. 4 交换机-fanout(订阅发布模式)
  5. 【 CodeForces - 1060B 】Maximum Sum of Digits(思维,构造)
  6. python 轮廓矩阵_python – 在3D numpy矩阵中绘制给定值的曲面轮廓
  7. 【高并发】JUC中的Executor框架详解2
  8. php rpoplpush,Redis Rpoplpush 命令
  9. 远程连接Ubuntu服务器
  10. Office 2016 (Preview)
  11. ModelSim之命令行仿真入门
  12. HBuilderX使用mac打包ios应用提示苹果根证书没有安装
  13. 网站SEO的七个技巧
  14. 盘点微软使用火热的编程语言!程序员:你看我还有机会吗?
  15. html 苏宁首页,简单实现
  16. visual fortran run-time error can45_64.dll
  17. 如何做好区块链社区?得社区者得天下
  18. postman的使用
  19. 解决:微信小程序只有调试或真机打开调试模式时可以访问网络,手机预览不能访问网络
  20. 全能编码器Mencoder(mencoder.exe)命令行用法

热门文章

  1. python数据驱动创建账号_Django创建超级管理员账号和修改密码
  2. linux登录日志保存多久,Centos清除系统日志和登录记录-Linux清除系统日志和登录记录的方法-吾爱编程网...
  3. easyUi reload 重定向URL
  4. idea DataGrip 使用图解教程
  5. vue学习代码理解v-for数组遍历和对象遍历以及事件处理
  6. beetl java例子_初识Java模板引擎Beetl之简单示例
  7. python读取压缩文件的指定后缀的文件_python打包压缩、读取指定目录下的指定类型文件...
  8. matlab怎么更改图形窗口的句柄值,matlab图形句柄属性
  9. 使用SQL2005 递归查询结合Row_Number()实现完全SQL端树排序
  10. python 八数码_python 处理八数码 双向BFS 拼图游戏 | 学步园