iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝
copy mutableCopy NSString
NSString *string = @
"汉斯哈哈哈"
;
// 没有产生新对象
NSString *copyString = [string copy];
// 产生新对象
NSMutableString *mutableCopyString = [string mutableCopy];
NSLog(@
"string = %p copyString = %p mutableCopyString = %p"
, string, copyString, mutableCopyString);
copy mutableCopy NSMutableString
NSMutableString *string = [NSMutableString stringWithString:@
"汉斯哈哈哈"
];
// 产生新对象
NSString *copyString = [string copy];
// 产生新对象
NSMutableString *mutableCopyString = [string mutableCopy];
NSLog(@
"string = %p copyString = %p mutableCopyString = %p"
, string, copyString, mutableCopyString);
结论:
注意:其他对象NSArray、NSMutableArray 、NSDictionary、NSMutableDictionary一样适用
copy NSObject
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy];
// 这里崩溃
崩溃:
看崩溃信息HSPerson应该先实现:
- (id)copyWithZone:(NSZone *)zone;
测试
#import "HSPerson.h"
@interface HSPerson()@end
@implementation HSPerson
- (id)copyWithZone:(NSZone *)zone
{
return
@
"汉斯哈哈哈"
;
}
@end
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy];
NSLog(@
"copyP: %@"
, copyP);
可以看出copyWithZone重新分配新的内存空间,则:
- (id)copyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
return
person;
// 有些人可能下面alloc,重新初始化空间,但这方法已给你分配了zone,自己就无需再次alloc内存空间了
// HSPerson *person = [[HSPerson alloc] init];
}
HSPerson *p = [[HSPerson alloc] init];
p.age = 20;
p.height = 170.0;
HSPerson *copyP = [p copy];
NSLog(@
"p = %p copyP = %p"
, p, copyP);
NSLog(@
"age = %d height = %f"
, copyP.age, copyP.height);
虽然copy了份新的对象,然而age,height值并未copy,那么:
- (id)copyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
person.age = self.age;
person.height = self.height;
// 这里self其实就要被copy的那个对象,很显然要自己赋值给新对象,所以这里可以控制copy的属性
return
person;
}
这时你会想,有NSMutableCopying?没错,是有这货:
- (id)mutableCopyWithZone:(NSZone *)zone
{
HSPerson *person = [[HSPerson allocWithZone:zone] init];
person.age = self.age;
person.height = self.height;
return
person;
}
NSCopying、NSMutableCopying有啥区别?
其实感觉没必要有NSMutableCopying,因为压根就没可变的HSPerson,但如果该对象有其他行为,可以借用NSMutableCopying实现,哈哈哈
copy.strong
说完深浅拷贝,理解copy.strong就轻松多了!
copy
#import @interface HSPerson : NSObject
@property (nonatomic, copy) NSString *name;
@end
NSMutableString *string = [NSMutableString stringWithFormat:@
"汉斯哈哈哈"
];
HSPerson *person = [[HSPerson alloc] init];
person.name = string;
// 不能改变person.name的值,因为其内部copy新的对象
[string appendString:@
" hans"
];
NSLog(@
"name = %@"
, person.name);
property copy 实际上就对name干了这个:
- (
void
)setName:(NSString *)name
{
_name = [name copy];
}
假设name为NSMutableString,会发生什么事?
@property (nonatomic, copy) NSMutableString *name;
这样会挨骂哦,实际上内部还是:
- (
void
)setName:(NSMutableString *)name
{
_name = [name copy];
}
copy出来的仍然是不可变字符!如果有人用NSMutableString的方法,就会崩溃:
strong
@property (nonatomic, strong) NSString *name;
NSMutableString *string = [NSMutableString stringWithFormat:@
"汉斯哈哈哈"
];
HSPerson *person = [[HSPerson alloc] init];
person.name = string;
// 可以改变person.name的值,因为其内部没有生成新的对象
[string appendString:@
" hans"
];
NSLog(@
"name = %@"
, person.name);
总结:用copy与strong取决于需求,如果不希望被外界更改用copy,反之用strong
iOS 浅谈:深.浅拷贝与copy.strong的更多相关文章
- 【转】iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝 copy mutableCopy NSString 1 2 3 4 5 6 NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSStri ...
- IOS 浅谈闭包block的使用
前言:对于ios初学者,block通常用于逆向传值,遍历等,会使用,但是可能心虚,会感觉block很神秘,那么下面就一起来揭开它的面纱吧. ps: 下面重点讲叙了闭包的概念,常用的语法,以及访问变量, ...
- 浅谈java浅拷贝和深拷贝
前言:深拷贝和浅拷贝的区别是什么? 浅拷贝:被复制的对象的所有变量都含有原来对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之, 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象.深拷 ...
- 浅谈Javascript 浅拷贝和深拷贝的理解
javascript中存储对象都是存地址的. 浅拷贝:浅拷贝是都指向同一块内存区块,浅拷贝共用同一内存地址,你改值我也变.如果拷贝的对象里面的值是一个对象或者数组,它就是浅拷贝,拷贝的知识引用地址. ...
- [iOS]浅谈NSRunloop工作原理和相关应用
一. 认识NSRunloop 1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main ...
- iOS——浅谈iOS中三种生成随机数方法
ios 有如下三种随机数方法:
- 浅谈C#浅拷贝和深拷贝
近来爱上一本书<编写高质量代码,改善C#程序的157个建议>,我想很多人都想编写高质量的代码,因为我们不仅仅是码农,更是一名程序员. 从今天开始,我将每天和大家分享这本书中的内容,并加上自 ...
- ios浅谈关于nil和 NIL区别及相关问题
本文转载至:http://blog.csdn.net/guozh/article/details/8469131 1.nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我 ...
- iOS 浅谈MVC设计模式及Controllers之间的传值方式
1.简述你对MVC的理解? MVC是一种架构设计.它考虑了三种对象:Model(模型对象).View(试图对象).Controller(试图控制器) (1)模型:负责存储.定义.操作数据 (2)视图: ...
随机推荐
- 如果layer层在iframe下不居中滚动
需要在layer前面加上parent.layer. 2.运用layer层的步骤: 1.引入1.8版本以上的jquery文件 <script type="text/javascript& ...
- 字符串编辑距离(Levenshtein距离)算法
基本介绍 Levenshtein距离是一种计算两个字符串间的差异程度的字符串度量(string metric).我们可以认为Levenshtein距离就是从一个字符串修改到另一个字符串时,其中编辑单个 ...
- url中的特殊符号含义
1. # 10年9月,twitter改版.一个显著变化,就是URL加入了"#!"符号.比如,改版前的用户主页网址为http://twitter.com/username改版后,就变 ...
- Why many EEG researchers choose only midline electrodes for data analysis EEG分析为何多用中轴线电极
Source: Research gate Stafford Michahial EEG is a very low frequency.. and literature will give us t ...
- 解读ASP.NET 5 & MVC6系列(9):日志框架
框架介绍 在之前的.NET中,微软还没有提供过像样的日志框架,目前能用的一些框架比如Log4Net.NLog.CommonLogging使用起来多多少少都有些费劲,和java的SLF4J根本无法相比. ...
- [LeetCode] Count Numbers with Unique Digits 计算各位不相同的数字个数
Given a non-negative integer n, count all numbers with unique digits, x, where 0 ≤ x < 10n. Examp ...
- EntityFramework、Dapper vs 草根框架性能大比拼,数据库访问哪家强?
扯淡 当前市面上 ORM 很多,有跑车型的,如 Dapper,有中规中矩型的,如 Mybatis.Net,也有重量型的,如 EntityFramework 和 NHibernate,还有一些出自草根之 ...
- Mysql查询——学习阶段
1.开篇 搞开发的都知道,当数据量很大的时候,我们的代码逻辑的简单性就显得十分重要,否则处理起来就需要花费相当多的时间.另外还有一个地方需要注意的是我们写的sql语句. 一个拥有多年开发的资深开发者可 ...
- mac 多php版本安装
mac上自带又apache和php. 自带的php缺少一些扩展(freeType),安装起来因为mac本身有一些sudo su都不可触及的权限,所以决定不动系统本身php,再装一个新的php不同版本. ...
- 关于js解析的一点小问题
先来看一下下面的一段代码有什么问题? <html><head><script src="./jquery.min.js"></script ...