热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

从@property说起(一)开题篇

什么是@property@property可以说是每一个iOS开发者最常用的一句代码,甚至没有之一。但是,在上古的Xcode4.4时代之前,事情并不是这个样子的。当时的iOS开发者
什么是 @property

@property可以说是每一个iOS开发者最常用的一句代码,甚至没有之一。但是,在上古的Xcode 4.4时代之前,事情并不是这个样子的。
当时的iOS开发者,每当需要一个属性的时候。总是需要写这么几句话:

.h
@property NSObejct *foo;
.m
@synthesize foo = _foo;

头文件中加上@property,那么编译器会自动添加下面一段代码:

- (NSObject *)foo;
- (void)setFoo:(NSObject *)newFoo;

也就是属性的setter和getter的声明。

那么@synthesize就是对应等效地实现了setter和getter。

- (NSObject *)foo {
return _foo;
}
- (void)setFoo:(NSObject *)newFoo {
_foo = newFoo;
}

而自从Xcode4.5开始,喜大普奔,开发者只需要使用一句

@property NSObject *foo;

就能直接做完三件事:

  1. 生成一个_foo名称的成员变量;

  2. 声明foo属性的setter和getter方法;

  3. 默认实现声明的两个setter和getter方法;

那么在后来的Xcode中,@synthesize还有什么用处呢?
首先我们在一个控制器中,总是需要使用self.view来操作控制器的view属性,而没法用_view成员变量来直接使用。这个就是因为我们默认的成员变量的声明,是在.m中用@synthesize view = _view;这种格式来声明的。那么继承自UIViewcontorller自然是取不到.m中声明的成员变量。于是,我们如果继承了一个父类,在用父类属性的成员变量时,就需要用@synthesize foo = _foo; 来在子类中使用。
然鹅其实还有一个相关的关键字,很少见。它就是@dynamic。
@dynamic 的意思就是跟系统说,不要创建 property 对应的成员变量(就是一般的 _someProperty),也不要自动生成 get/set 方法,同时不要报错,到在运行时我自己会来添加 get/set 方法。比如像 CoreData 的对象,有些属性并不是用 _someProperty 存起来的,而是从数据库里读出来的。那么就不需要系统默认的 getter、setter,而是在运行时生成。

属性

但是我们在开发中,更多所写的,是这个样子

@property (nonatomic, weak) UIView *backgroudView;

那么括号里面的东西,到底又做了什么,一个好的开发者,决不能容忍自己写下的一段代码不知道它的真实作用。
实际上,在括号里的东西,叫做属性的attribute,特征,或者叫特质。一个属性可以拥有的attribute,可以有四种:

原子性

原子性有两个关键字,atomic和nonatomic,很好理解。原子性和非原子性。如果是atomic修饰的属性,那么在默认生成的setter和getter方法中,会通过锁定机制确保属性的atomicity。但是原子性是不能保证线程安全的,这个问题随意搜一下就有答案,不再赘述。那么nonatomic自然就是不加锁的。

读写权限

默认属性会添加readwrite,同时生成setter和getter,所以本质上是由@synthesize来实现的。
而readonly就是代表只生成getter方法,而只能读的属性显然没有意义,所以,readonly属性一般都需要在这个类的实现中直接使用实例变量赋值,或者在class extension中重新定义为读写属性。

指定方法名

这个很简单,就是使用getter=或setter=来指定方法名,用来更改默认的存取成员变量的方法名称,一般只是在BOOL类型属性时常用。

内存管理

这个就是那个经久不衰的问题点。实际上,属性用来封装数据,但是数据本身需要有所有权,所以内存管理的关注点在于持有方式,而不需要关心使用方式。所以,内存管理关键字影响的是setter方法的实现,本质上,是成员变量对赋值的持有方式。
我们暂时只研究ARC下的几个关键字,assign,strong,weak,copy和unsafe_unretained(没错,这个也是ARC支持的修饰)。

  • assign 适用于简单赋值操作,赋值时直接将原值覆盖,没有任何多余操作。

  • strong 实际和__strong同门。__strong是id类型和对象类型默认的所有权修饰符。所以,strong修饰符显然只能用在id类型和对象类型上。

  • weak 和strong是对应关键字,适用范围同strong一样,作用特征和assign类似,但是个人认为weak才是ARC的精髓所在。稍后展开讨论。

  • copy 这个修饰的结果和strong类似,但是它并不保留新值,而是copy一份,重新保存。这个特质经常用在NSString上保护其封装性。因为mutable类型一旦copy,就保存了当前这一份值储存,成为不可变的类型。

  • unsafe_unretained 这个很少见,因为它的特质同assign相同,但是使用与对象类型。它与weak的区别在于,属性所指的对象清空之后,属性值并不会清空。

先简单认知一下它们的特征,更深入的问题,在之后一篇中详细研究。


推荐阅读
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 2020年9月15日,Oracle正式发布了最新的JDK 15版本。本次更新带来了许多新特性,包括隐藏类、EdDSA签名算法、模式匹配、记录类、封闭类和文本块等。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 本文对SQL Server系统进行了基本概述,并深入解析了其核心功能。SQL Server不仅提供了强大的数据存储和管理能力,还支持复杂的查询操作和事务处理。通过MyEclipse、SQL Server和Tomcat的集成开发环境,可以高效地构建银行转账系统。在实现过程中,需要确保表单参数与后台代码中的属性值一致,同时在Servlet中处理用户登录验证,以确保系统的安全性和可靠性。 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 包含phppdoerrorcode的词条 ... [详细]
  • 我有一个从C项目编译的.o文件,该文件引用了名为init_static_pool ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • IOS Run loop详解
    为什么80%的码农都做不了架构师?转自http:blog.csdn.netztp800201articledetails9240913感谢作者分享Objecti ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 在 CentOS 6.4 上安装 QT5 并启动 Qt Creator 时,可能会遇到缺少 GLIBCXX_3.4.15 的问题。这是由于系统中的 libstdc++.so.6 版本过低。本文将详细介绍如何通过更新 GCC 版本来解决这一问题。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
author-avatar
手机用户2602919727
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有