- (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的更多相关文章

  1. ios OC 关键字 copy,strong,weak,assign的区别

    一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(stron ...

  2. ios中strong, weak, assign, copy

    copy 和 strong(retain) 区别 1. http://blog.csdn.net/itianyi/article/details/9018567 大部分的时候NSString的属性都是 ...

  3. 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方 ...

  4. IOS内存管理学习笔记

    内存管理作为iOS中非常重要的部分,每一个iOS开发者都应该深入了解iOS内存管理,最近在学习iOS中整理出了一些知识点,先从MRC开始说起. 1.当一个对象在创建之后它的引用计数器为1,当调用这个对 ...

  5. iOS内存管理策略和实践

    转:http://www.cocoachina.com/applenews/devnews/2013/1126/7418.html 内存管理策略(memory Management Policy) N ...

  6. iOS内存管理(objective-c)

    移动app开发中,由于移动设备内存的限制,内存管理是一个非常重要的话题.objective-c的内存管理,不仅是面试当中老生常谈的一个必问话题,也是日常项目开发中,特别需要重视的环节.对于笔者这种以j ...

  7. iOS内存管理(一)

    最近有时间,正好把iOS相关的基础知识好好的梳理了一下,记录一下内存相关方面的知识. 在理解内存管理之前我觉得先对堆区和栈区有一定的了解是非常有必要的. 栈区:就是由编译器自动管理内存分配,释放过程的 ...

  8. iOS内存管理的知识梳理

    从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ...

  9. 【Bugly干货分享】iOS内存管理:从MRC到ARC实践

    Bugly 技术干货系列内容主要涉及移动开发方向,是由Bugly邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明出处. 对于iOS程序员来说,内存管理是入门的 ...

随机推荐

  1. django通过添加session来保存公共变量

    有时候我们需要所有页面都使用同一个变量,比如用户登录信息.那不可能render每一个页面时都去传递一个变量,会非常麻烦 而用session可以解决这个问题   web的session可以通过reque ...

  2. Excel学习之图表创建

    前言:由于工作的需要,现在需要恶补Excel知识,温故而知新,不记录下来自己的学习的点点滴滴怎么能行 Excel版本:2016 一.插入如下图所示的数据源: 1.勾选图表区域范围 2.选中区域范围后直 ...

  3. SpringBoot配置logback

    1.在SpringBoot中已经集成了logback.在pom.xml中加入以下spring-boot-starter依赖,使用默认版本即可: <dependency> <group ...

  4. VIM常见命令

    1.删除所有数据 进入到第1行按下d,然后输入G回车,此时内容被全部清除 2.替换 :s/vivian/sky/ 替换当前行第一个 vivian 为 sky:s/vivian/sky/g 替换当前行所 ...

  5. 并发编程中Future和Callable使用

    Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减少系统的响应时间,提高系统的吞吐量. 看一个小的demo: 看一下执行结果: 这是异步去获取结果的示例,在子线程去处理任务的时 ...

  6. c#调用dll接口传递utf-8字串方法

    1. 起源: VCU10之视频下载模块,采用纯python编码实现,c++代码调用pythonrun.h配置python运行环境启动python模块,编译为dll给c#调用,以使界面UI能够使用其中功 ...

  7. 《centos系列》配置vim编辑器

    直接wget到~/目录下: wget  http://files.cnblogs.com/ma6174/vimrc.zip 然后进行解压: unzip  -f  vimrc.zip  -d  ~/ 参 ...

  8. layer使用

    1引入js <script src="${pageContext.request.contextPath }/js/jquery-1.9.1.min.js" type=&qu ...

  9. SQL Server2005/2008 作业执行失败的解决办法

    数据库:SQL Server 2005/2008,运行环境:Windows Server 2008  在数据库里的所有作业都执行失败,包括自动执行和手动执行.在事件查看器里看到的错误报告如下: 该 作 ...

  10. git删除提交历史

    精准入口==>官方文档 Q:我们在提交代码时,把密码或者敏感信息也提交了,怎么办? A:“在本地删除密码或敏感信息后,再push到远程仓库” Q:"但这样删除后,在仓库的commit历 ...