Objective-C中的属性机制
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中的属性机制的更多相关文章
- Objective - C中属性和点语法的使用
一.属性 属性是Objective—C 2.0定义的语法,为实例变量提供了setter.getter方法的默认实现能在一定程度上简化程序代码,并且增强实例变量的访问安全性 ...
- Spring中 bean定义的parent属性机制的实现分析
在XML中配置bean元素的时候,我们常常要用到parent属性,这个用起来很方便就可以让一个bean获得parent的所有属性 在spring中,这种机制是如何实现的? 对于这种情况 tra ...
- C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西付给另一个类对象,而不是付给引用地址)
from:https://blog.csdn.net/poxiaohai2011/article/details/27555951 //C# 中利用反射机制拷贝类的字段和属性(拷贝一个类对象的所有东西 ...
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...
- java 中利用反射机制获取和设置实体类的属性值
摘要: 在java编程中,我们经常不知道传入自己方法中的实体类中到底有哪些方法,或者,我们需要根据用户传入的不同的属性来给对象设置不同的属性值,那么,java自带的反射机制可以很方便的达到这种目的,同 ...
- java中的反射机制在Android开发中的用处
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反 ...
- 别再为了this发愁了------JS中的this机制
别再为了this发愁了------JS中的this机制 题记:JavaScript中有很多令人困惑的地方,或者叫做机制.但是,就是这些东西让JavaScript显得那么美好而与众不同.比方说函数也是对 ...
- Python中的属性管理
Python管 理属性的方法一般有三种:操作符重载(即,__getattr__.__setattr__.__delattr__和 __getattribute__,有点类似于C++中的重载操作符).p ...
- SQL Server 内存中OLTP内部机制概述(四)
----------------------------我是分割线------------------------------- 本文翻译自微软白皮书<SQL Server In-Memory ...
随机推荐
- spring动态代理
接下来我们来体会下动态代理带给我们的便利 package aop006; public interface Girl { public void KFC(String datetime); publi ...
- 使用post方式提交表单如何获取图片数据及其他文本参数[NodeJS]
当POST方式提交包含图片的表单时,如上传图片时,需要在<form>字段需要添加参数enctype="multipart/form-data",表明以二进制方式传输数据 ...
- [转]关于SVN的操作批处理示例
为了一句话:不要动手做机器能够做的事情. 天天工作用svn,更新啥的打开目录啥的动作天天在重复.每次写些命令也蛮无聊的,不说了,看下面: @echo off rem 显示部分 @echo 注 意 事 ...
- thrift 服务端linux C ++ 与客户端 windows python 环境配置(thrift 自带tutorial为例)
关于Thrift文档化的确是做的不好.摸索了很久才终于把跨linux与windows跨C++与python语言的配置成功完成.以下是步骤: 1) Linux下环境配置 ...
- WebService的工作原理
Web Service全称XML Web Service WebService是一种可以接收从Internet或者Intranet上的其它系统中传递过来的请求,轻量级的独立的通讯技术.是:通过SOAP ...
- mui框架中底部导航的跳转1
mui框架极大的方便了app的开发但是我们在做页面之间的切换时发现不能实现 a 链接的跳转,这是应为mui相关的一些控件是通过拦截a标签上的href来实现的,所以mui.js会阻止a标签上的href跳 ...
- SSH配置与讲解
一.Struts 首先介绍Struts,在web项目中加入Struts的jar包,并在Web.xml中添加Struts的配置: <filter> <filter-name ...
- Fedora17安装MySQL及配置
一.安装 以下操作均是在root用户下进行操作.首先,如果以前有安装过,这次卸载后安装的话,最好是先将/var/lib/mysql/里面的内容全部删掉(如果不重要的话),我就遇到过没有删除这些东西,结 ...
- ASP.NET Core 优雅的在开发环境保存机密(User Secrets)
前言 在应用程序开发的过程中,有的时候需要在代码中保存一些机密的信息,比如加密密钥,字符串,或者是用户名密码等.通常的做法是保存到一个配置文件中,在以前我们会把他保存到web.config中,但是在A ...
- 使用密码记录工具keepass来保存密码
在第一章,曾经给过您建议,密码不要保存在文档中,那样不安全,如果密码很多而且又很复杂,人的大脑是不可能很容易记住的,只能记录下来,如果不能记在文档中那记在哪里呢?下面介绍给您一款记录密码的软件,使用. ...