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

相关文章

javax.net.ssl.SSLHandshakeException:异常原因及解决方案

《javax.net.ssl.SSLHandshakeException:异常原因及解决方案》javax.net.ssl.SSLHandshakeException是一个SSL握手异常,通常在建立SS... 目录报错原因在程序中绕过服务器的安全验证注意点最后多说一句报错原因一般出现这种问题是因为目标服务器

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

CSS3中的字体及相关属性详解

《CSS3中的字体及相关属性详解》:本文主要介绍了CSS3中的字体及相关属性,详细内容请阅读本文,希望能对你有所帮助... 字体网页字体的三个来源:用户机器上安装的字体,放心使用。保存在第三方网站上的字体,例如Typekit和Google,可以link标签链接到你的页面上。保存在你自己Web服务器上的字

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

IDEA中Maven Dependencies出现红色波浪线的原因及解决方法

《IDEA中MavenDependencies出现红色波浪线的原因及解决方法》在使用IntelliJIDEA开发Java项目时,尤其是基于Maven的项目,您可能会遇到MavenDependenci... 目录一、问题概述二、解决步骤2.1 检查 Maven 配置2.2 更新 Maven 项目2.3 清理本

Java空指针异常NullPointerException的原因与解决方案

《Java空指针异常NullPointerException的原因与解决方案》在Java开发中,NullPointerException(空指针异常)是最常见的运行时异常之一,通常发生在程序尝试访问或... 目录一、空指针异常产生的原因1. 变量未初始化2. 对象引用被显式置为null3. 方法返回null

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

IDEA下"File is read-only"可能原因分析及"找不到或无法加载主类"的问题

《IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题》:本文主要介绍IDEA下Fileisread-only可能原因分析及找不到或无法加载主类的问题,具有很好的参... 目录1.File is read-only”可能原因2.“找不到或无法加载主类”问题的解决总结1.File