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. Objective - C中属性和点语法的使用

    一.属性        属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性         ...

  2. Spring中 bean定义的parent属性机制的实现分析

    在XML中配置bean元素的时候,我们常常要用到parent属性,这个用起来很方便就可以让一个bean获得parent的所有属性 在spring中,这种机制是如何实现的?     对于这种情况 tra ...

  3. C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)

    from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. java 中利用反射机制获取和设置实体类的属性值

    摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...

  6. java中的反射机制在Android开发中的用处

    JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...

  7. 别再为了this发愁了------JS中的this机制

    别再为了this发愁了------JS中的this机制 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对 ...

  8. Python中的属性管理

    Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...

  9. SQL Server 内存中OLTP内部机制概述(四)

    ----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...

随机推荐

  1. 基于shell脚本比较数字大小

    让用户输入两个数来比较他们的大小 先用touch命令新建一个1.sh文件 在用vi进入i进入编辑状态 输入 #!/bin/bash read "" a read "&qu ...

  2. LINUX 编译安装 PHP 环境

    今天终于有时间 总结一下 linux 的编译安装 php 环境同学给我发了他写的文档 ,基本就可以实现编译安装了我同学文章地址: http://penghui.link/articles/2016/0 ...

  3. 移动端Web适配的两种做法思路总结

    看了几篇文章,理一下网易跟淘宝移动端适配的思路,主要是参考 从网易与淘宝的font-size思考前端设计稿与工作流 像素相关概念 物理像素(physical pixel) 一个物理像素是显示器(手机屏 ...

  4. 代码-->发呆

    代码,敲着敲着,就发呆了. 其实安安静静敲代码,是一种享受.开着不快不慢的音乐,徜徉在代码的世界里,忘记了时间的存在. 原本备忘录中提醒我13点看书,一小时又一小时的延后,已经不记得自己按了多少次一小 ...

  5. DSY1531*Bank notes

    Description Byteotian Bit Bank (BBB) 拥有一套先进的货币系统,这个系统一共有n种面值的硬币,面值分别为b1, b2,..., bn. 但是每种硬币有数量限制,现在我 ...

  6. oracle 全文检索创建脚本示例

    --创建全文索引 grant execute on ctx_ddl to username;--使用其他帐号对username授权exec ctx_ddl.create_preference('my_ ...

  7. 关于c++的 vector 容器的使用及创建方法

    1.vector向量容器的使用,vector具有自动管理的功能,可以进行元素的查找删除 创建方法: (1)  vector<int > v; 创建了一个v的容器,没指定容量: (2)  v ...

  8. .NET 4.5.1 预览版新特性

    上个月的微软Build大会上宣布了.NET 4.5.1的推出,Heydarian的这个演讲题为".NET开发中的新内容",涵盖了.NET Framework中一些重要的新特性. H ...

  9. ABP理论学习之启动配置

    返回总目录 本篇目录 配置ABP 配置模块 为模块创建配置 为了在应用启动时配置ABP和模块,ABP提供了一个基础设施. 配置ABP 配置ABP是在模块的PreInitialize事件中完成的.下面的 ...

  10. 写一个脚本,自动启动tomcat

    我的服务器是使用tomcat的,时不时tomcat的进程会突然结束掉,不知道为什么,从日志上看也没有任何可疑之处,貌似就这样突然没了,接下来的日志都是重新启动tomcat之后打印的了.原因找不到,但要 ...