• 创建一个分类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. Centos 如何安装Django环境

    Centos 如何安装Django环境 | 浏览:954 | 更新:2014-10-31 20:34 针对Centos这一Linux发行版,进行django环境的搭建过程介绍.   工具/原料 Cen ...

  2. memache session

    Memcache和PHP memcach扩展安装请见http://koda.iteye.com/blog/665761 设置session用memcache来存储 方法I: 在 php.ini 中全局 ...

  3. extjs MVC模式的个人看法

    针对一个后台管理页面是mvc模式,后台也是mvc模式下的项目,要怎么去熟悉呢? 首先以我个人的认解,先从后台的管理界面来看,会有control,model,store,view:其中先看view的代码 ...

  4. 使用Reveal

    添加Reveal.framework,设置Other link flags 添加Debug为 -ObjC,添加 libz 库 这里介绍 Reveal UI 分析工具的简单使用,至于使用他分析手机 Ap ...

  5. nRF51822之模拟IIC

    使用的工程为是基于sdk10工程 在将以nRF51_SDK_10.0.0_dc26b5e\examples\peripheral\twi_sensor作为模版 修改代码main.c #include ...

  6. eclipse dbviewer,eclipse java8

    进入/home/xxx(用户名)/.local/share/applications,看是否有eclipse和深度音乐desktop配置文件,为eclipse.desktop配置图标, 那现在终端输入 ...

  7. Lazarus for Raspbian安装

    春节前看到树莓派 2代开始销售,第一时间在淘宝下单购买,无奈春节期间放假,要到3月份才可能收到,只能用QEMU模拟器先熟悉树莓系统.对从turbo Pascal开始的人来讲,如果能在树莓系统使用Pas ...

  8. zepto--toggle函数

    学习zepto源码时,发现一个很佩服的写法. 关键点在三元选择符. 首先,假定settings是有传入参数的,此时settings会进行隐式强制类型转换为布尔值,如果为真,元素显示,如果为假,元素隐藏 ...

  9. php---初学者git使用

    1.git自学网站 廖雪峰的官方网站 2.安装一个简单的git 创建用户名.邮箱 git config --global user.name "your name" git con ...

  10. 从while(cin>>a)开始探讨cin

    1. 首先cin>>a返回的是左操作数,也就是返回cin. cin的条件状态中: cin.eof()    判断流是否到达文件的结束符 cin.fail()    判断IO操作是否失败 在 ...