一、前言
          在这里,我通过实例去介绍strong和copy的区别(%p打印出来对象的地址)
     ViewController.h           
  1. #import <UIKit/UIKit.h>
  2.  
  3. @interface ViewController : UIViewController
  4.  
  5. @property(nonatomic,strong) NSString *name;
  6. @end
  7. ViewController.m
  8. - (void)viewDidLoad {
  9. [super viewDidLoad];
  10. NSMutableString *myName = [NSMutableString stringWithString:@"zhangsan"];
  11. self.name = myName;
  12. NSLog(@"myName's address:%p",myName);
  13. NSLog(@"self.name's address:%p",self.name);
  14. }
        运行结果是:
  1. 2015-07-21 16:38:50.911 Test[4369:2323491] myName's address:0x7967f4c0
  2. 2015-07-21 16:38:50.912 Test[4369:2323491] self.name's address:0x7967f4c0
         而当我们把.h中的strong改成copy时,
  1. @property(nonatomic,copy) NSString *name;
        运行结果是:
  1. 2015-07-21 16:40:09.938 Test[4394:2330879] myName's address:0x78deb9b0
  2. 2015-07-21 16:40:09.938 Test[4394:2330879] self.name's address:0x78dea270
       对比可以发现:
        当我们使用strong时,myName对象和self.name的地址相同,说明两者指向的是同一个地址空间:0x7967f4c0
        而当我们把.h中name的strong改成copy时,myName和self.name地址不同,说明两者指向的是不同的地址空间。
          myName是:0x78deb9b0
            self.name是:0x78dea270
     这说明:当我们使用copy的时候表示拥有不同的存储空间,存放的是相同的内容。因此如果我们对myName进行修改,self.name是不会受到影响的。

  在ARC情况下,如果源字符串是NSString时,由于字符串不可变,所以不管是strong还是copy属性的对象,都是指向源对象,copy只是进行了浅拷贝。

  而如果源字符串是NSMutableString的话,strong是强引用,只是增加了源字符串的引用计数,而copy则是对源字符串进行了深拷贝,产生了一个新的对象,而且开辟了新的内存空间。此时如果我们修改源字符串的值,那么strong特性的字符串也会跟着修改,而copy的则不变。

* 大多情况下,建议使用copy,因为一般我们将对象声明为NSString时,都不希望它改变。

 总结:
  这里你应该学到:
    1、strong和copy的区别
    2、我们可以用%p打印出对象的地址。

strong vs copy的更多相关文章

  1. Objective-C中的Strong、Copy与MutableCopy

    面试过程中经常被问到ARC中Strong.Copy的区别是什么.普通的回答是:一样.文艺(正确)的回答是:分情况(我擦!WQY#$&Y**%OWEUR) 可以先参考这篇文章http://www ...

  2. iOS之属性修饰符 retain、strong和copy区别测试

    时不时会有点迷惑属性修饰符retain.strong.copy三者之间的区别,还是把测试过程记录下来好一点! 1.属性修饰符结论 2.给retain.strong.copy修饰的字符串属性赋值指针变化 ...

  3. strong和copy的区别

    问题描述 在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用c ...

  4. 关于@property()的那些属性及ARC简介【nonatomic,atomic,assign,retain,strong,weak,copy。】

    @property()常用的属性有:nonatomic,atomic,assign,retain,strong,weak,copy. 其中atomic和nonatomic用来决定编译器生成的gette ...

  5. iOS知识基础篇--@property,@synthesize, nonatomic,atomic,strong,weak,copy,assign,retain详解

    一.@property 这个关键词的唯一作用就是声明getter.setter方法接口. 二.@synthesize 实现setter.getter方法,找不到实例变量则主动创建一个. 三.nonat ...

  6. 深复制与浅复制&&strong,copy修饰符总结

    又是一个老生常谈的话题,可是貌似这个问题,好多ios开发工程师并不能理解透彻,所以简单记录分析一下深复制与浅复制的原理以及strong,copy修饰符的原理和使用.   一.深复制与浅复制      ...

  7. iOS之strong和copy

    深拷贝和浅拷贝 深拷贝和浅拷贝主要是对类类型而言的,浅拷贝就是指针拷贝,深拷贝是对象拷贝. property的strong和copy 在接触iOS程序时经常会看到程序某些类类型属性被strong修饰, ...

  8. iOS 关键词assign、strong、copy、weak、unsafe_unretained

    关键词assign.strong.copy.weak.unsafe_unretained 影响: 是否开辟新的内存 是否有引用计数增加 strong 指向并拥有该对象.其修饰的对象引用计数会 +1,该 ...

  9. 关于strong、copy、weak、assign的常规用法

    strong   对于普通的OC对象都是使用strong copy     对于 NSString,Block weak    用于OC对象,1.当出现循环强引用的时候,必须要保证一端是weak, 2 ...

随机推荐

  1. Java 动态生成 PDF 文件

    每片文章前来首小诗:   今日夕阳伴薄雾,印着雪墙笑开颜.我心仿佛出窗前,浮在半腰望西天.  --泥沙砖瓦浆木匠 需求: 项目里面有需要java动态生成 PDF 文件,提供下载.今天我找了下有关了,系 ...

  2. HAProxy(二):HAProxy的ACL规则实现智能负载均衡详解与示例

    一.HAProxy的ACL的功能 ACL(Access Control List)访问控制列表,HAProxy中的ACL的匹配条件和控制条件有许多种,功能很强大,可以通过源地址.源端口.目标地址.目标 ...

  3. python字典操作和内置方法

    一 字典基本介绍 python中只有字典是映射结构,通过key取值,并且key是不可变数据类型,而value可以是任意数据类型. 字典通过一个花括号,里面存放key:value的数据结构来定义.理论上 ...

  4. MVC 【ASPX视图引擎】

    新建项目----ASP.NET MVC 4 Web 应用程序------选择模板(空).视图引擎(ASPX) 1.认识控制器Controller using System; using System. ...

  5. 三层+EasyUI+Ajax 提交Form表单

    源代码下载:http://download.csdn.net/download/qq_25237531/10267746

  6. SQL Server 基本INSERT语句

    1.基本INSERT语句,单行插入 如果没有列出列,则使一一对应. 2.多行插入 3.INSERT INTO ... SELECT 语句 要插入的语句是从其他表中查询出来的. 注意:数据类型得相同或者 ...

  7. 2017-12-01 中英文代码对比之ZLOGO 4 & LOGO

    基于前文中文编程语言之Z语言初尝试: ZLOGO 4的一些评论, 此文尝试作一个非常简单的代码对比, 使讨论更加有实例根据. 下图是节选自前文最后的示例代码, 由于选取的对照LOGO版本 (alanc ...

  8. 【代码笔记】Web-JavaScript-JavaScript注释

    一,效果图. 二,代码. <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...

  9. jsPlumb.jsAPI阅读笔记(官方文档翻译)

    jsPlumb DOCS 公司要开始做流程控制器,所以先调研下jsPlumb,下文是阅读jsPlumb提供的document所产生的归纳总结 setup 如果不使用jQuery或者类jQuery库,则 ...

  10. Java 执行Shell脚本指令

    一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...