ios 内存管理与property copy strong weak assign
- (void)fun
{
NSString* str = [[NSString alloc] initWithString:@"string"];
NSLog(@"%d", [str retainCount]);
}
可以看到 str的计数器为-1
而把initWithString换成initWithFormat 计数器就是1
------解决方案--------------------------------------------------------
没有区别.
NSString本身没有什么特殊的,这里的问题在于使用常量字符串去初始化一个NSString,而系统会对常量字符串进行优化,所有引用同一个常量字符串的NSString共享同一块内存,这块内存位于常量区,引用计数为7fffffff,表示不使用通常的引用计数管理机制,不会释放.
------解决方案--------------------------------------------------------
@"string" 是常量,所以,它就没有开辟新的空间,仅是一个指针。initWithFormat 是要开辟空间滴⋯⋯
block,苹果官方有说明,因为有上下文变量捕获,应该使用copy。
NSSring 用copy和strong区别
本质上来讲,copy和strong都没有错,但不是说,NSString用copy就一定是最好的.
那么,什么时候用copy,什么时候用strong呢?
- 首先,为什么要用copy?
因为copy安全!
copy修饰的NSString,在初始化时,如果来源是NSMutableString的话,会对来源进行一次深拷贝,将来源的内存地址复制一份,这样,两个对象就一点关系就没有了,无论你怎么操作来源,都不会对自己的NSString有任何影响
比如:
你有一个@property(nonatomic,copy) NSString *str;
然后有一个NSMutableString *sourceStr;
当你进行str = sourceStr操作之后,紧接着你又改变了sourceStr的内容sourceStr = @"change";那么str的内容并不会改变. 如果你的str不是copy修饰的,而是strong修饰的,那么str的值也会变成@"change";因为strong是浅拷贝的,并不会对来源的内存地址进行拷贝
- 那么问题来了,既然copy安全,那为什么不都用copy?
这里我们需要了解一点,copy修饰的NSString在进行set操作时,底层是这样实现的:
我们还是举上面那个例子,进行str = sourceStr操作时,内部会执行一个操作:str = [sourceStr copy];
那么这个copy里面做了什么呢?if ([str isMemberOfClass:[str class]])
没错,就是进行一次判断,判断来源是可变的还是不可变的,如果是不可变,那么好,接下来的操作就跟strong修饰的没有区别,进行浅拷贝;如果是可变的,那么会进行一次深拷贝
所以,copy操作内部会进行判断,你别小看了这个if操作所消耗的内存,一次不重要,十次可能也可以忽略不计,但当你的项目十分庞大时,有成百上千个个NSString对象,多多少少会对你的app的性能造成一定的影响.
- 那么回到最初的问题,什么时候用copy,什么时候用strong
#你只需要记住一点,当你给你的的NSString对象赋值时,如果来源是NSMutableString,那么这种情况就必须要用copy;如果你确定来源是不可变类型的,比如@"http://www.jianshu.com/users/691d9ed740cf/latest_articles"这种固定的字符串,那么用strong比较好
ios 内存管理与property copy strong weak assign的更多相关文章
- ios OC 关键字 copy,strong,weak,assign的区别
一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(stron ...
- ios中strong, weak, assign, copy
copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是 ...
- iOS 内存管理-copy、 retain、 assign 、readonly 、 readwrite、nonatomic、@property、@synthesize、@dynamic、IB_DESIGNABLE 、 IBInspectable、IBOutletCollection
浅谈iOS内存管理机制 alloc,retain,copy,release,autorelease 1)使用@property配合@synthesize可以让编译器自动实现getter/setter方 ...
- IOS内存管理学习笔记
内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...
- iOS内存管理策略和实践
转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...
- iOS内存管理(objective-c)
移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...
- iOS内存管理(一)
最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...
- iOS内存管理的知识梳理
从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ...
- 【Bugly干货分享】iOS内存管理:从MRC到ARC实践
Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...
随机推荐
- jstorm集成kafka
本人是spark的拥趸,因为工作中需要用到jstorm,作记录如下. pom.xml <dependencies> <dependency> <groupId>co ...
- PHPActiveRecord 学习三
#事务处理 注意事务 数据库要用InnoDB引擎 $c1 = User::connection(); try { //开启事务 $c1->transaction(); //sql语句 $sql ...
- ES3之closure ( 闭包 )
词法作用域中使用的域,是变量在代码中声明的位置所决定的.嵌套的函数可以访问在其外部声明的变量. 闭包是函数和声明该函数的词法环境的组合. 1 创建单个闭包 JavaScript中的函数会形成闭包. 闭 ...
- java编程 求和
用java编程,实现字符串强制类型转化成整数型,用到Integer.parseInt(),可以把字符串强制转换成整数 结果截图
- 解决node-pre-gyp install --fallback-to-build 卡住不动
一般是因为需要下载国外的包,要么连VPN,要么使用淘宝的镜像: 使用cnpm: npm install -g cnpm --registry=https://registry.npm.taobao.o ...
- 【python】初识python
[命名规范] 模块名:小写字母,单词之间用_分割:例如:ad_stats.py 包名:和模块名一样 类名:单词首字母大写:例如:ConfigUtil 全局变量名:大写字母,单词之间用_分割:例如:NU ...
- xcode - pod install 出现错误
xcode 10 上pod install 出现错误 error: /Users/apple/Desktop/VenusClient/Pods/Pods/Target Support Files/Po ...
- Redis 与Spring-data-redis 整合后封装的工具类
此工具类方法是使用了redis 与spring 整合后,才可以使用的工具类,将 spring-data-redis 一些我们开发中常用的方法进行了封装,方便我们日常开发中进行调用: package c ...
- 关于MYSQL字符集问题(一)
MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation). 对于字符集的支持细化到四个层次: 服务器(se ...
- Ubuntu下ClickHouse安装
ClickHouse目前仅支持在ubuntu下面部署,而且国内中国文档也比较少 >vi /etc/apt/sources.list #在最后一行追加 #ubuntu16.04 使用Xenial: ...