iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因

本文主要是介绍iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

//联系人:石虎  QQ: 1224614774昵称:嗡嘛呢叭咪哄

一、代码实现数组赋值不用copy数据分析

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong)NSArray *array;//全局不可变数组

@end

@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

   

    NSMutableArray *mArray = [NSMutableArrayarray];

    [mArray addObject:@"shihu"];

    self.array = mArray;   

    [mArray addObject:@"zhangying"];    

    NSLog(@"self.array --->%@ ,mArray --> %@",self.array,mArray);

}


提问:大家猜猜控制器会输出什么数据???

打印结果:

2017-09-10 12:19:28.300bug~demo[74440:1165432] self.array --->(

    shihu,

    zhangying

) ,mArray --> (

    shihu,

    zhangying

)

原因很简单, 因为Objective-C支持多态.

所以表面上self.array是NSArray对象, 其实骨子里是NSMutableArray对象.这样的话将会对后期DEBUG增加很大的成本, 可能会导致莫名其妙的错误.


二、用copy数据分析


- (void)viewDidLoad {

    [super viewDidLoad];


    NSMutableArray *mArray = [NSMutableArrayarray];

    [mArray addObject:@"shihu"];

    //self.array = mArray;

    self.array = [mArraycopy];//浅拷贝一次    

    [mArray addObject:@"zhangying"];    

    NSLog(@"self.array --->%@ ,mArray --> %@",self.array,mArray);    

}

提问:大家猜猜控制器会输出什么数据???

打印结果:

2017-09-10 12:25:27.720 bug~demo[74493:1169444] self.array --->(

    shihu

) ,mArray --> (

    shihu,

    zhangying

)


       结论:这样就能保证不管赋值的是可变还是不可变数组, NSArray就是NSArray了


三、补充图表更加理解copy与mutableCopy的区别:


图1:



谢谢!!!

这篇关于iOS @property中的NSString, NSArray, NSDictionary属性为什么大多时候用copy而不用strong的原因的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/451889

相关文章

vue监听属性watch的用法及使用场景详解

《vue监听属性watch的用法及使用场景详解》watch是vue中常用的监听器,它主要用于侦听数据的变化,在数据发生变化的时候执行一些操作,:本文主要介绍vue监听属性watch的用法及使用场景... 目录1. 监听属性 watch2. 常规用法3. 监听对象和route变化4. 使用场景附Watch 的

MyBatis Plus大数据量查询慢原因分析及解决

《MyBatisPlus大数据量查询慢原因分析及解决》大数据量查询慢常因全表扫描、分页不当、索引缺失、内存占用高及ORM开销,优化措施包括分页查询、流式读取、SQL优化、批处理、多数据源、结果集二次... 目录大数据量查询慢的常见原因优化方案高级方案配置调优监控与诊断总结大数据量查询慢的常见原因MyBAT

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

深度剖析SpringBoot日志性能提升的原因与解决

《深度剖析SpringBoot日志性能提升的原因与解决》日志记录本该是辅助工具,却为何成了性能瓶颈,SpringBoot如何用代码彻底破解日志导致的高延迟问题,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言第一章:日志性能陷阱的底层原理1.1 日志级别的“双刃剑”效应1.2 同步日志的“吞吐量杀手”

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

Java.lang.InterruptedException被中止异常的原因及解决方案

《Java.lang.InterruptedException被中止异常的原因及解决方案》Java.lang.InterruptedException是线程被中断时抛出的异常,用于协作停止执行,常见于... 目录报错问题报错原因解决方法Java.lang.InterruptedException 是 Jav

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

python删除xml中的w:ascii属性的步骤

《python删除xml中的w:ascii属性的步骤》使用xml.etree.ElementTree删除WordXML中w:ascii属性,需注册命名空间并定位rFonts元素,通过del操作删除属... 可以使用python的XML.etree.ElementTree模块通过以下步骤删除XML中的w:as