文档章节

@property的中的关键字特性

kingsOSZT
 kingsOSZT
发布于 2016/01/21 14:25
字数 854
阅读 34
收藏 0


@property还有一些关键字,它们都是有特殊作用的,比如上述代码中的nonatomic,strong:


@property(nonatomic,strong) NSString *carName;

@property(nonatomic,strong) NSString *carType;

我把它们分为三类,分别是:原子性,存取器控制,内存管理。


原子性


atomic(默认):atomic意为操作是原子的,意味着只有一个线程访问实例变量。atomic是线程安全的,至少在当前的存取器上是安全的。它是一个默认的特性,但是很少使用,因为比较影响效率,这跟ARM平台和内部锁机制有关。

nonatomic:nonatomic跟atomic刚好相反。表示非原子的,可以被多个线程访问。它的效率比atomic快。但不能保证在多线程环境下的安全性,在单线程和明确只有一个线程访问的情况下广泛使用。

存取器控制


readwrite(默认):readwrite是默认值,表示该属性同时拥有setter和getter。

readonly: readonly表示只有getter没有setter。

有时候为了语意更明确可能需要自定义访问器的名字:


@property (nonatomic, setter = mySetter:,getter = myGetter ) NSString *name;

最常见的是BOOL类型,比如标识View是否隐藏的属性hidden。可以这样声明:


@property (nonatomic,getter = isHidden ) BOOL hidden;

内存管理


@property有显示的内存管理策略。这使得我们只需要看一眼@property声明就明白它会怎样对待传入的值。


assign(默认):assign用于值类型,如int、float、double和NSInteger,CGFloat等表示单纯的复制。还包括不存在所有权关系的对象,比如常见的delegate。

@property(nonatomic) int running;

@property(nonatomic,assign) int running;

以上两段代码是相同的。


在setter方法中,采用直接赋值来实现设值操作:


-(void)setRunning:(int)newRunning{  

    _running = newRunning;  

retian:在setter方法中,需要对传入的对象进行引用计数加1的操作。

简单来说,就是对传入的对象拥有所有权,只要对该对象拥有所有权,该对象就不会被释放。如下代码所示:

-(void)setName:(NSString*)_name{  

     //首先判断是否与旧对象一致,如果不一致进行赋值。  

     //因为如果是一个对象的话,进行if内的代码会造成一个极端的情况:当此name的retain为1时,使此次的set操作让实例name提前释放,而达不到赋值目的。  

     if ( name != _name){  

          [name release];  

          name = [_name retain];  

     }  

}

strong:strong是在IOS引入ARC的时候引入的关键字,是retain的一个可选的替代。表示实例变量对传入的对象要有所有权关系,即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。

weak:在setter方法中,需要对传入的对象不进行引用计数加1的操作。

简单来说,就是对传入的对象没有所有权,当该对象引用计数为0时,即该对象被释放后,用weak声明的实例变量指向nil,即实例变量的值为0。


注:weak关键字是IOS5引入的,IOS5之前是不能使用该关键字的。delegate 和 Outlet 一般用weak来声明。


copy:与strong类似,但区别在于实例变量是对传入对象的副本拥有所有权,而非对象本身。


本文转载自:http://www.devtalking.com/articles/you-should-to-know-property/

kingsOSZT
粉丝 2
博文 26
码字总数 8456
作品 0
松江
私信 提问
OC语言@property @synthesize和id

OC语言@property @synthesize 和id 一、@property @synthesize 关键字 注意:这两个关键字是编译器特性,让xcode可以自动生成getter和setter的声明和实现。 (一)@property 关键字 @propert...

法斗斗
2016/02/24
7
0
Jquery的prop和attr

借鉴文章: http://www.w3help.org/zh-cn/causes/SD9006 http://stylechen.com/attribute-property.html http://openwares.net/linux/dompropertyelementattribute.html 1、prop和attr共性(......

CurtainRight
2016/04/14
13
0
Javascript 不可不知的秘密 -- Class 与 面向对象

1.类对象的创建方式 new 关键字,通过调用 constructor()方法来创建对象 Object.create(), es5 2. 类的属性 属性特性 可写(writable) : 可以设置,修改属性的数值 可枚举(enumerable) : 可以...

longjuelegend
2016/09/06
31
0
CSS3 继承的技巧

稍不留意便会忽略掉级联样式表的特点。大多数开发者都知道inherit关键字,但有几个新的CSS3继承特性你可能不知道… property: inherit; inherit关键字代表“使用指定给父元素的所有值”。如果...

oschina
2013/10/28
6K
0
学习C#:Attribute与Property

一.什么是Attribute 先看下面的三段代码: 1.自定义Attribute类:VersionAttribute [AttributeUsage(AttributeTargets.Class)] public class VersionAttribute : Attribute { public string......

随智阔
2013/04/09
0
0

没有更多内容

加载失败,请刷新页面

加载更多

在Linux系统中创建SSH服务器别名

如果你经常通过 SSH 访问许多不同的远程系统,这个技巧将为你节省一些时间。你可以通过 SSH 为频繁访问的系统创建 SSH 别名,这样你就不必记住所有不同的用户名、主机名、SSH 端口号和 IP 地...

老孟的Linux私房菜
昨天
1
0
高德API入门教程

项目需求 1、实现打开地图就能定位到中心显示标注点 2、点击标注显示保利可爱岛的详细信息 3、实现导航功能 <!doctype html><html><head> <meta charset="utf-8"> <meta http-......

我叫小糖主
昨天
7
0
聊聊Elasticsearch的MonitorService

序 本文主要研究一下Elasticsearch的MonitorService MonitorService elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/monitor/MonitorService.java public class MonitorServic......

go4it
昨天
3
0
二、Docker

1、Docker - The TLDR(Too Long,Don't Read,Linxu 终端工具 ) Docker是在Linux和Windows上运行的软件。它创建、管理和编排容器。该软件以开源方式开发,在Github上作为Moby开源项目的一部分。...

倪伟伟
昨天
3
0
Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部