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

【iOS】属性关键字

文章目录自动合成存取propertysynthesizedynamic一.读写性控制二.setter相关修饰符copy深浅拷贝copy与strong关键字的差异三.原子性修饰符属性

文章目录

  • 自动合成存取
    • @property
    • @synthesize
    • @dynamic
  • 一.读写性控制
  • 二.setter相关修饰符
    • copy
      • 深浅拷贝
    • copy与strong关键字的差异
  • 三.原子性修饰符


属性分为三大类:

  1. 读写性控制
  2. setter相关修饰符
  3. 原子性修饰符


自动合成存取

@property


  • @property其实是在编译阶段由编译器自动帮我们生成setter方法,getter方法的

@synthesize


  • 当我们在实现文件中不写@synthesize propertyName时,在Xcode 4.5之前的版本不会帮我们自动实现setter和getter方法,系统当然也不再会为我们生成对应的成员变量。但是在Xcode 4.5之后可以不用写@synthesize
  • 当我们既定义了@synthesize,又在实现文件中人为重写setter和getter方法时,那么@synthesize将不再工作,也就不会为我们创建没有定义的_propertyName成员变量了,这时候如果在setter和getter方法中调用_propertyName将会发生编译错误

@dynamic


  • @dynamic 告诉编译器:属性的 setter 与 getter 方法由用户自己实现,不自动生成。

一.读写性控制
  • readOnly只读,只会生成getter方法,不会生成setter方法(但外部还是可以用KVC去赋值)
  • readWrite可读可写,会生成setter方法,也会生成getter方法(默认设置)

二.setter相关修饰符
  • assign:表示直接赋值,用于基本数据类型,包括id类型,这个修饰符不会牵涉到内存管理,但是如果是对象类型,使用此修饰符则可能会导致内存泄露。(不会使引用计数+1,也就是直接赋值)
  • retain:针对对象类型进行内存管理,如果对基本数据类型使用,则X-code会直接报错,当给对象类型使用此修饰符时,setter方法会先将旧的对象属性release掉,在对新的对象进行一次赋值并进行一次retain操作 (会使引用计数+1)
  • week:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil
  • strong:打开ARC时才会使用,相当于retain
  • copy:建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝

copy


  • NSStringNSArrayNSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableStringNSMutableArrayNSMutableDictionary.为确保对象中的属性值不会无意间变动,应该在设置新属性值时拷贝一份保护其封装性block,也经常使用copy,关键字block。

@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?

  • 因为父类指针可以指向子类对象,使用copy的目的是为了让本对象的属性不受外界影响,使用copy无论给我传入是一个可变对象还是不可对象,我本身持有的就是一个不可变的副本.如果我们使用是strong,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性.

深浅拷贝


关键字注释
浅复制(shallow copy)在浅复制操作时,对于被复制对象的每一层都是指针复制。
深复制(one-level-deep copy)在深复制操作时,对于被复制对象,至少有一层是深复制。
完全复制(real-deep copy)在完全复制操作时,对于被复制对象的每一层都是对象复制。

非集合类对象的 copy 与 mutableCopy

[不可变对象 copy] // 浅复制
[不可变对象 mutableCopy] //深复制
[可变对象 copy] //深复制
[可变对象 mutableCopy] //深复制

例如:

NSArray* arr1 = [NSArray arrayWithObjects:@"苹果", @"桃子", @"葡萄", nil];NSArray* arr3 = [arr1 mutableCopy];NSLog(@"arr1 = %p, arr2 = %p, arr3 = %p", arr1, arr2, arr3); //每个元素的指针地址相同

请添加图片描述

  • 如上,arr1和arr2地址相同,但与arr3不相同。
  • 因为arr1是不可变对象,arr2复制时使用copy关键字,进行了浅拷贝
  • arr3复制时使用mutableCopy关键字,创建了一个新的对象,进行了深拷贝

copy与strong关键字的差异

当我分别使用copy和strong关键字定义属性再进行复制时

@property (nonatomic, copy) NSArray* arr1;
@property (nonatomic, strong) NSArray* strongArr1;

NSMutableArray* test = [NSMutableArray arrayWithObjects:@"a", @"b", @"c", nil];self.arr1 = test;self.strongArr1 = test;NSLog(@"%p , %p",test, _arr1);NSLog(@"%p , %p",test, _strongArr1);

  • 可以看到,当我对test数组分别对copy和strong关键字定义的数组进行赋值时,用copy关键字声明的arr1属性的地址发生了变化,也就是产生了一个新的对象,进行了深复制。而用strong关键字声明的strongArr1属性的地址和test相同,进行了浅复制
  • strong修饰下,我们的strongArr1会持有原来的对象,使原来的对象引用计数+1,属于浅拷贝,这时候进行操作时,test和strongArr1的值都会发生改变
  • 一般来说对于不可变对象我们使用copy修饰从而防止它的值发送改变,而可变的对象使用strong修饰。

三.原子性修饰符

atomic:表示是线程安全的

nonatomic:表示是非线程安全的,使用此属性性能会提高一些

(系统默认是atomic)


推荐阅读
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOMEbinjava–option来启 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • iOS开发Debug和Release的理解
    2019独角兽企业重金招聘Python工程师标准参考:http:blog.csdn.netmad1989articledetails406580331&# ... [详细]
author-avatar
wp_725133
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有