Swift和Objective-C中的属性特性
Objective-C的开发者们都知道,OC中的属性(Property)通常都有一组特性(Attributes)来说明该属性的一些附加信息。在Swift当中,这个特性的功能“似乎”是被取消掉了,但是,我们仍然可以通过一些不同的方法来指明属性的这些特性。 基本的属性声明使用属性,我们可以避免手工编写繁琐的setter和getter方法,避免因为这些方法来内存的问题,同时也节省编写代码的时间。 在Objecitve-C中,我们声明属性一般都是这样声明的: // Some.h
@property int count;
// Some.m
@synthesize count;
而在Swift当中,我们则是这样声明就可以了: // Some.swift
var count: Int
注意的是,Swift中的属性只能够声明在类的上下文环境当中,而不能声明在其他地方(包括类当中的方法),否则Xcode就不会认为它是属性,而是认为它是一个局部变量了。 读写特性特写特性主要是对属性的读写权限进行控制与操作的,这个特性是针对于外部的。因为属性实际上会生成两个方法: 在Objective-C中,拥有这样两个读写特性: 比如说我们在Objecitve-C中可以声明这样一个只读属性: @property(readonly) int count;
这样这个属性在外部只能够读取(使用getter),而不能够修改了,因为Xcode不会生成这个属性对应的 而在Swift当中,则有如下两种选择: 对于存储属性来说, let count: Int
而对于计算属性来说, let count: Int {
get {
// ...do something
}
}
setter语意特性setter语意特性主要是用来告诉Xcode,对于这个属性,应该如何去自动实现它的 在Objective-C中,拥有三个setter语意特性:
是不是不好理解?没关系,我们举一个例子来研究下。 比如说这样一个语句声明: NSString *paper = [[NSString alloc] initWithString:@"纸"];
这一段代码将会执行以下两种动作:
对于setter语意特性来说,它们都是在执行 assign那么对于 NSString *newsPaper = [paper assign];
此时, 换句话说, Retain那么对于 NSString *newsPaper = [paper retain];
这个时候, 换句话说, Copy那么对于 NSString *newsPaper = [paper copy];
这个时候,就会在堆上重新开辟一段内存空间,来存放 换句话说, 什么时候使用这些语意特性呢?只要是值类型、简单类型的类型,比如说 那么对于含有可深复制子类的对象,比如说
至于其他的 等等,Swift呢?我们开头已经提到过,getter语意特性是针对非ARC情况的,我们都知道,Swift语言是直接采用ARC进行内存管理的,所以这些操作在Swift中都是找不到对应的情况的。 不过,对于Swift来说,有一项特性和 NSCopyingSwift中用 和 所有者特性对于ARC来说,上一节中所说的 在Objective-C中,拥有两个所有者特性: 对于 对于 那么怎么来理解 假设保险柜现在是超市外面的寄存处的保险柜,大家都知道,寄存处在某个保险柜不再使用的时候(对象被释放),就会回收这个保险柜(回收内存空间),以供下一个人使用。 我们申请了一个保险柜(申请内存空间)之后,我们将我们的东西(对象)存放到保险柜当中,那么如何要保证我们的东西不会被超市坑掉呢?这就需要保险柜给我们的开门的钥匙(强引用),只要这个钥匙还在,那么我们的东西就不会被回收(一定期限内)。 再假设为了防止恐怖分子,超市对这些保险柜都置放了扫描装置,只要我们的东西还在保险柜里面,那么保安就能够通过装置看到我们的东西(弱引用)。而如果我们用钥匙把里面的东西拿走了,将钥匙归还了(销毁对象)。那么保安就不能看到我们的东西了。为了节省电力,这个保险柜的扫描装置就会进入休眠(所有弱引用变为nil)。 面对ARC机制中,最令人头疼的就是“循环强引用”的问题,所谓循环强引用,就是我们申请了两个保险柜,然后分别将另外一个保险柜的钥匙锁在了保险柜当中。这样就会造成什么现象呢?我们完全就无法归还钥匙了,这两个保险柜就无法再重新使用了。那么使用弱引用,就不会出现这个问题了。 好了,我们就此打住,关于循环强引用的解决方案,不在本文的叙述范围之中。 那么Swift呢?和Objective-C一样,Swift同样也有 在一般的开发流程中,往往都建议将 原子特性原子特性,简要来说,是针对多线程而设置的。Objective-C拥有两种原子特性,分别是 我们知道,如果使用多线程的话,有时会出现两个线程互相等待而导致的死锁现象。使用 而如果使用 相比之下,swift目前还不支持这些特性。如果我们要实现线程安全,似乎只能使用 总结我们总共介绍了四种属性特性,分别是读写特性、setter语意特性、所有者特性和原子特性。一个特性中,只能够有一个出现,不能够出现多个读写特性的情况。此外,setter语意特性和所有者特性也是互斥的,因为一旦使用了所有者特性,就说明项目使用了ARC,而ARC是不支持setter语意特性的。 对于Swift来说,我们目前能够以其他方式实现的,也就是“读写特性”和“所有者特性”而已,其他的特性目前是赞不支持的。因此,可以看到,在不久的将来,原子特性可能也会提供支持。 综上所述,我们分析和对比了Objective-C和Swift的属性特性,可以看出Swift使用了一些特殊的特性来实现原有的Objective-C属性特性的功能,虽然目前还有很多欠缺的地方,但是也不失减轻了开发者的负担。
文/星夜暮晨(简书作者) 原文链接:http://www.jianshu.com/p/9a67ffb9eb6a 著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |