setter getter 属性 点语法
转载自: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 属性 点语法的更多相关文章
- JavaScript 操作对象属性(设置属性, setter/getter, 序列化)
参考自<<JavaScript权威指南 第6版>>, 文字太多反而不易理清其中的关系, 直接上代码和注释 /* * 对象的setter和getter属性: * 定义为一个或者两 ...
- OC基础:属性.点语法.KVC 分类: ios学习 OC 2015-06-24 17:24 61人阅读 评论(0) 收藏
属性:快速生成setter和getter 属性也包括:声明和实现 1.属性的声明写在.h中 格式:@property 数据类型 变量名; 如果实例变量一致的时候,属性的声明可以合并,每一个属性之间使用 ...
- 学习es6 setter/getter研究
1.背景 在ES6中,我们对类的定义如下 class Person { // 构造函数 constructor (name) { // 属性初始化 this.name = name; } // 成员方 ...
- jQuery 3.0 的 setter/getter 模式
jQuery 的 setter/getter 共用一个函数,通过是否传参来表明它是何种意义.简单说传参它是 setter,不传它是 getter. 一个函数具有多种意义在编程语言中并不罕见,比如函数重 ...
- iPhone开发教程之retain/copy/assign/setter/getter
assign: 简单赋值,不更改索引计数 copy: 建立一个索引计数为1的对象,然后释放旧对象retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 1. 接触过C,那么 ...
- 说声PHP的setter&getter(魔术)方法,你们辛苦了
php作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,主要以setter&getter方法为主. 首先,咱们得知道什么叫魔术方法? 官方定义为:_ ...
- 周末,说声php的setter&getter(魔术)方法,你们辛苦了
php 作为快速迭代项目的语言,其牛逼性质自不必多说.今天咱们要来说说php语言几个魔术方法,当然了,本文主要以setter&getter方法说明为主. 首先,咱们得知道什么叫魔术方法? 官方 ...
- 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 ...
- css属性值语法解读
//margin 形式语法: [ <length> | <percentage> | auto ]{1,4} //合法实例: margin: style /*单值语法 */ 举 ...
随机推荐
- Binary Trees
1. Definiation What is Binary Trees? Collection of node (n>=0) and in which no node can have more ...
- openwrt启动过程(脚本)
来源: http://wiki.openwrt.org/doc/techref/preinit_mount#first.boot 基本的openwrt启动顺序为: 1.boot loader loa ...
- MySQL(3)-索引
一.索引类型 在MySQL中,存储引擎使用索引,首先在索引中找到对应值,然后根据匹配的索引记录中找到对应的行. 无论是多么复杂的ORM工具,在精妙和复杂的索引面前都是"浮云".这里 ...
- 【Vmware】VirtualBox下虚拟机的网络配置
1.VirtualBox的提供了四种网络接入模式,它们分别是:1.NAT 网络地址转换模式(NAT,Network Address Translation)2.Bridged Adapter ...
- log4j.properties文件的配置
Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使用这三个组件可以轻松 ...
- a标签包含块级元素问题
a标签包含块级元素是不符合W3c标准的,但是淘宝也有这样的布局暂且认为可以这样(有时候布局需要这样写) 当a标签包含了div这样的块级元素时a标签是要转换成块级元素的使用display:block.但 ...
- DataTable Javascript Link not working on 2nd page
$(document).ready(function () { var otable = $('#tbl-resources').dataTable( { bJQueryUI: false, bFil ...
- elicpse之tomcat配置
环境:eclipse4.5.0,tomcat7.0.57 部署描述:按照一般的部署,把tomcat部署到webapps的下面,server options 下面选的是 Modules auto rel ...
- 根据NSString字符串长度自动改变UILabel的frame
相信大家都遇到过这种需求.如果一个不慎,容易做成这个模样: 话不多说,上代码. 1.首先,设置UILabel的相关属性 UILabel *tmpLabel = [[UILabel alloc] ini ...
- 《JavaScript高级程序设计》读书笔记 ---数据类型
ECMAScript 中有5 种简单数据类型(也称为基本数据类型):Undefined.Null.Boolean.Number.String和Object——复杂数据类型,Object 本质上是由一组 ...