• 创建一个分类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. AMD PerfStudio

    用PerfStudio 抓DX11 OIT

  2. css实现文字过长省略显示

    .simpleName { width:110px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; } <div cl ...

  3. bower 基本应用

    1.安装 npm install -g bower 2.指定下载目录: 在根目录建立文件  .bowerrc { "directory": "vendor/bower_d ...

  4. 【转】Unity3D的输入(Input)——键盘和鼠标

    http://blog.csdn.net/lingyun_blog/article/details/41451565 Unity3D使用input类控制用户的输入,输入包括了用户键盘,鼠标,触摸,重力 ...

  5. Apache的HBase与cdh的sqoop集成(不建议不同版本之间的集成)

    1.修改sqoop的配资文件 2.从mysql导入到hbase(import) bin/sqoop import \ --connect jdbc:mysql://linux-hadoop3.ibei ...

  6. WPF绑定方式

    绑定到其它元素 <Grid>     <StackPanel>         <TextBox x:Name="textbox1" />    ...

  7. JS懒加载

    4.如何使用js懒加载图片       a.懒加载图片是基于jquery.js的,所以: <script src="jquery.js" type="text/ja ...

  8. UITableView & UITableViewController

    内容概要: 本文先讲解了UITableView概述,然后主要从应用方面讲解了UITableViewController(包括add.delete.move单元cell的操作,以及UITableView ...

  9. LightOj 1024 - Eid (求n个数的最小公约数+高精度)

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1024 题意:给你n(2<=n<=1000)个数, 然后求n个数的最小公倍数 ...

  10. SqlServer2008R2安装步骤

    参考http://jimshu.blog.51cto.com/3171847/585023/