转载自:http://liuyafang.blog.51cto.com/8837978/1543715

什么时setter,getter,

  • 在OC里, 为实例变量赋zhi的方法称作setter(设置器)

  • 读取实例变量值的方法称作getter(访问器)

  • 我们之前写的那些赋值取值的方法都可以称作setter和getter

setter、getter的书写格式

  • OC里规定里setter和getter的书写格式

  • 如果一个实例变量是 int age; 或者int_age;

  • setter的书写格式如下 - (void)setAge:(int)age;即set+首字母大写的实例变量名(忽略下划线)

  • getter的书写格式如下, -(int)age; 即返回值类型与变量类型一致,方法名与实例变量名相同(忽略下划线)

setter、getter与实例变量的关系

  • 无论setter还是getter内部操作的是实例变量

  • 每一个实例变量都需要一对setter和getter方法

属性的定义

  • 属性都声明:使用@property声明属性(例如:@property NSString*name;)

  • 相当于@interface中声明里两个方法

  • - (void)setName:(NSString *)name;

  • -(NSString *)name;

属性的实现

  • 属性的实现:使用@synthesize实现属性(例如 :@synthesize name = _name)

  • 相当于@implementtation实现里

  • - (void)setName:(NSString *)name;

  • - (NSString *)name;

属性的属性

  • Objective-C提供属性的的是为了简化程序员编码

  • 为属性提供了一些关键字用以控制setter、getter的实现细节

  • 这些关键字我们称为属性的属性(attribute)

  • 一共3大类attribute。

属性的属性共有三大类

第一类

  • 1。 读写性控制(readonly,readwrite,setter,getter)

  • 如果读写性控制的关键字是readonly,是告诉编译器,只声明getter方法(无setter方法)

例如;@property(readonly)NSString *name;  等价于  - (NSString *)name;

  • 如果是readwrite ,告诉编译器,即声明setter有声明getter

例如:@property(readwrite)NSString *name;

等价于 - (NSString *)name;

- (void)setName:(NSString *)name;

  • readwrite是读写性控制的默认设置

第二类

  • 2.原子性控制(nonatomic、atomic)

  • 如果原子性控制的关键字是atomic。setter、getter方法在多线程访问下是绝对安全的,即setter、getter内部做了多线程访问处理,原子性控制的默认设置是atomic;

  • 如果原子性控制的关键字是nonatomic,setter、getter方法内部不会做多线程访问处理,仅仅是普通多setter、getter方法

。。

  • 程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能。

  • 同城设置为nonatomic, 某些属性需要线程安全对时候,才定义为atomic

例如:@property(readwrite , nonatomic)NSString *name;

等价于;- (NSString *)name;

- (void)setName:(NSString *)name;

第三类

  • 3.语义设置(assign,retain,copy)

  • 如果语义设置对关键字是assign。setter、getter内部实现是直接赋值,

例如:@property(nonatomic , assign)NSString *name;

- (void)setName:(NSString *)name

_name = name;

-(NSString *)name

return   _name;

  • 如果语义设置的关键字是retain。setter、getter的内部实现会做内存优化

例如:@property(nonatomic,retain)NSString *name;

- (void)setName:(NSString *)name

{ if(_name != name){

[_name release];

_name = [name retain];

}

}

- (NSString *)name{

return [[_name retain]autorelease];

  • 如果语义设置的关键字是copy,setter、getter的内部实现也会做内存优化

例如 @porperty(nonatomic , copy)NSString *name;

- (void)setName:(NSString *)name

{

if (_name != name) {

[_name release];

_name = [name retain];

}

}

- (NSString *)name

{

return [[_name retain] autorelease];

}

属性需要注意的是

  • 如果属性是非对象类型(比如int,float等)属性等语义设置只用assign

  • 如果属性是对象类型(比如NSString,NSArray等)属性等语义设置使用retain

  • 如果属性是对象类型,并且想得到参数的copy,使用copy关键字

-点语法的使用

  • 凡事符合系统默认setter、getter书写格式的方法,都可以使用点语法

例如:[person setName:@“zhangsan”];

可以等价写成 person.name = @“zhangsan”;

NSString *name = [person name];

可以等价写成NSString *name = person.name;

  • 属性是一对getter、setterfangfa,点语法是属性的另一种调用格式

setter getter 属性 点语法的更多相关文章

  1. JavaScript 操作对象属性(设置属性, setter/getter, 序列化)

    参考自<<JavaScript权威指南 第6版>>, 文字太多反而不易理清其中的关系, 直接上代码和注释 /* * 对象的setter和getter属性: * 定义为一个或者两 ...

  2. OC基础:属性.点语法.KVC 分类: ios学习 OC 2015-06-24 17:24 61人阅读 评论(0) 收藏

    属性:快速生成setter和getter 属性也包括:声明和实现 1.属性的声明写在.h中 格式:@property 数据类型 变量名; 如果实例变量一致的时候,属性的声明可以合并,每一个属性之间使用 ...

  3. 学习es6 setter/getter研究

    1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...

  4. jQuery 3.0 的 setter/getter 模式

    jQuery 的 setter/getter 共用一个函数,通过是否传参来表明它是何种意义.简单说传参它是 setter,不传它是 getter. 一个函数具有多种意义在编程语言中并不罕见,比如函数重 ...

  5. iPhone开发教程之retain/copy/assign/setter/getter

    assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 1. 接触过C,那么 ...

  6. 说声PHP的setter&getter(魔术)方法,你们辛苦了

    php作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,主要以setter&getter方法为主. 首先,咱们得知道什么叫魔术方法? 官方定义为:_ ...

  7. 周末,说声php的setter&getter(魔术)方法,你们辛苦了

    php 作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,本文主要以setter&getter方法说明为主. 首先,咱们得知道什么叫魔术方法? 官方 ...

  8. Writable atomic property '***' cannot pair a synthesized setter/getter with a user defined

    1. warning: Semantic Issue: Writable atomic property 'number' cannot pair a synthesized setter/gette ...

  9. css属性值语法解读

    //margin 形式语法: [ <length> | <percentage> | auto ]{1,4} //合法实例: margin: style /*单值语法 */ 举 ...

随机推荐

  1. Spring入门学习(一)

    Spring的主要功能是控制反转和面向切面编程,下面我们就来编写第一个spring的程序来体验一下控制反转 首先是加载配置文件 <?xml version="1.0" enc ...

  2. Excel教程(10) - 逻辑运算符

    AND 用途:所有参数的逻辑值为真时返回 TRUE(真):只要有 一个参数的逻辑值为假,则返回 FALSE(假). 语法:AND(logical1,logical2,  ). 参数:Logical1, ...

  3. Rational Rose 2003 逆向工程转换C++ / VC++ 6.0源代码成UML类图

    目录 1.安装&破解Rational Rose 2003 1.1 安装Rose 2003 1.2 破解Rose 2003 1.3运行出错“没有找到suite objects.dl” 2. Ra ...

  4. 洛谷-笨小猴-NOIP2008提高组复赛

    题目描述 Description 笨小猴的词汇量很小,所以每次做英语选择题的时候都很头疼.但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大! 这种方法的具体描述如下:假设m ...

  5. 星语硬件检测专家 V4.3 官方版

    软件名称: 星语硬件检测专家 软件语言: 简体中文 授权方式: 免费软件 运行环境: Win 32位/64位 软件大小: 15.8MB 图片预览: 软件简介: 星语硬件检测专家是一款功能非常强大的硬件 ...

  6. 。◕‿◕。TMD

    。◕‿◕。TMD TimeLimit: 2000/1000 MS (Java/Others)  MenoryLimit: 32768/32768 K (Java/Others) 64-bit inte ...

  7. windows7旗舰版系统自带组件IIS搭建ftp

    1.win7,”开始“,打开”控制面板“,点击”程序“,看到”程序和功能“,如图所示: 2.点击”打开或关闭Windows功能“,如图所示: 3.成功后,打开”控制面板“,点击”系统和安全“,点击”管 ...

  8. 如何为CentOS 7配置静态IP地址

    问题:在CentOS 7上,我想要将我其中一个网络接口从DHCP改为静态IP地址配置,如何才能永久为CentOS或RHEL 7上的网络接口分配静态IP地址? 如果你想要为CentOS 7中的某个网络接 ...

  9. angular中重要指令介绍($eval,$parse和$compile)

    在angular的服务中,有一些服务你不得不去了解,因为他可以说是ng的核心,而今天,我要介绍的就是ng的两个核心服务,$parse和$compile.其实这两个服务讲的人已经很多了,但是100个读者 ...

  10. Power oj2498/DP/递推

    power oj 2498 /递推 2498: 新年礼物 Time Limit: 1000 MS Memory Limit: 65536 KBTotal Submit: 12 Accepted: 3  ...