• 创建一个分类Person设置属性@property(nonatomic,strong) NSString * name;

  • 在- (void)viewDidLoad 中打印测试

  • name的属性是strong,则给name赋值的时候是强指针的name指向了可变的str的内存空间,从打印地址的结果知道,per.name 与str的地址一样,如果对可变的str做了改动( [str setString:@"好啊好啊"]),则per.name的值也会相应改变(因为他们指向的是同一个内存地址).然而这不是我们想要的结果.
  • 如果给per.name赋值了一个不可变的字符串..就不用说了,指向同一个内存地址,都不可以改变.


  • 给指针name换成copy属性

  • 在- (void)viewDidLoad 中打印测试

  • 从打印结果可以看到per.name 与可变的 str不是同一个内存地址.per.name与str是两个完全不想关的对象,则对可变的str做修改,完全不影响per.name的值.
    *如果试图对per.name做修改[per.name setString:@"hello"] ---不可以---我们的目的已经达到.

  • 把per.name赋值给不可变的str测试

  • 地址相同,不可改变.只是引用计数器+1

一个对象的准确类型取决于被分配的内存空间的类型

小结:

  • NSString的指针建议使用copy属性,它指向的如果是可变的NSMutablestring的str,则会创建新的对象(开辟新的内存空间),对原对象str做修改不会影响per.name的值.并且per.name也不能改变
  • per.name指针属性是copy,指向的不变的NSString的str,则不会创建新对象,只是引用计数+1
  • per.name指针的属性是strong的时候,如果per.name指向了课变的NSMutablestring的str,则str与per.name指针指向了同一个内存地址,str做出修改,per.name也会跟着变.
    *per.name指针的属性是strong的时候,如果per.name指向了不可变的NSString则都不能改变.
  • 总之:NSString用copy属性,都不可改变per.name的值.strong属性,看情况.

成员变量NSString类型指针的属性为什么用copy(属性)的更多相关文章

  1. runtime-对成员变量和属性的操作

    成员变量 首先我们来看看成员变量在runtime中是什么样的 在runtime中成员变量是一个objc_ivar类型的结构体,结构体定义如下 struct objc_ivar { char *ivar ...

  2. 成员变量和属性区别(@property那点事儿)

    历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...

  3. iOS中成员变量和属性区别

    历史由来: 接触iOS的人都知道,@property声明的属性默认会生成一个_类型的成员变量,同时也会生成setter/getter方法. 但这只是在iOS5之后,苹果推出的一个新机制.看老代码时,经 ...

  4. SpringMVC处理Date类型的成员变量方法

    原文链接:http://www.tuicool.com/articles/aYfaqa 在使用 SpringMVC 的时候,我们可能需要将一个对象从 View 传递给 Controller .而当这个 ...

  5. Objective-C 点语法 成员变量的作用域 @property和@synthesize关键字 id类型

    点语法 1.利用点语法替换set方法和get方法 方法调用 Student *stu = [Student new]; [stu setAge : 18]; int age = [stu age]; ...

  6. OC中在.h和.m中声明的属性和成员变量有何区别?

    相比Swift而言,OC规矩太多. 差不多,.h中声明的属性和成员变量均可以在子类中访问到.而.m则不可.而属性其实也就是成员变量的一种简写,其内部自动包含了getter和setter方法. 如图:V ...

  7. Java中字段、属性、成员变量、局部变量、实例变量、静态变量、类变量、常量

    首先看个例子: package zm.demo; public class Demo { private int Id;//成员变量(字段).实例变量(表示该Id变量既属于成员变量又属于实例变量) p ...

  8. runtime之玩转成员变量

    前言: 不铺垫那么多,单刀直入吧:runtime是一个C和汇编写的动态库,就像是一个小小的系统,将OC和C紧密关联在一次,这个系统主要做两件事情. 1,封装C语言的结构体和函数,让开发者在运行时创建, ...

  9. 【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    一. Objective-C 方法详解 1. 方法属性 (1) OC 方法传参机制 Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本; -- 基本类型 (值传 ...

随机推荐

  1. ThinkPHP 3.2.2 在 volist 多重循环嵌套中使用 if 判断标签

    今天在 ThinkPHP 3.2.2 的试图模板中使用多重循环,用来把相应类别下对应的文章都依次循环出来,但是无论如何只能循环出类别,类别下的文章无法循环出,( 错误 ) 代码如下: <voli ...

  2. THinkPHP在模板中的volist循环使用外部变量注意事项

    循环中.自己定义的id=volist就可以使用$volist.id 或者$volist['id'] 而外面定义的变量就不能使用$vo.id 必须使用$vo['id']<volist name=& ...

  3. Ubuntu下搭建NodeJS+Express WEB开发框架

    Ubuntu下搭建NodeJS+Express WEB开发框架 2012-12-27 15:06 作者: NodeJSNet 来源: 本站 浏览: 2,966 次阅读 我要评论暂无评论 字号: 大 中 ...

  4. Yii源码阅读笔记(十九)

    View中渲染view视图文件的前置和后置方法,以及渲染动态内容的方法: /** * @return string|boolean the view file currently being rend ...

  5. Front-end Developer Interview Questions

    Front-end-Developer-Interview-Questions A list of helpful front-end related questions you can use to ...

  6. storm-kafka-0.8-plus 源码解析

    https://github.com/wurstmeister/storm-kafka-0.8-plus http://blog.csdn.net/xeseo/article/details/1861 ...

  7. 基于java工程开发RMI服务端

    ServiceRegist.java import java.rmi.Remote; import java.rmi.RemoteException; public interface Service ...

  8. Summary of java stream classes

    Java’s stream classes are good for streaming sequences of bytes, but they’re not good for streaming ...

  9. Ubuntu 14.04 在桌面上双击运行shell 脚本文件

    http://askubuntu.com/questions/465531/how-to-make-a-shell-file-execute-by-double-click up vote7down ...

  10. PBAP 1.0协议翻译(Part1)

    添加vCard3.0 Spec的链接- http://tools.ietf.org/html/rfc2425- http://tools.ietf.org/html/rfc2426 寻找最新的Spec ...