• 创建一个分类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. The P4 Language Specification v1.0.2 Header and Fields

    前言 本文参考P4.org网站给出的<The P4 Language Specification v1.0.2>的第二部分首部及字段,仅供学习:). 欢迎交流! Header and Fi ...

  2. DirectX 发展历程

    在Windows下开发游戏,大家都会联想到DirectX.实际上,DirectX并不等同于游戏,它也不是写游戏程序的唯一选择.其实,DirectX只是提供了一种更直接的控制硬件的API库而已.当然,它 ...

  3. buffer overflow

    Computer Systems A Programmer's Perspective Second Edition We have seen that C does not perform any ...

  4. Delphi dbf文件如何定位记录(即设置Table的RecNum属性来移动到该记录号)

    Delphi的table的RecNum属性,可以用来定位记录,如:self.Table1.RecNum:=23;即可以让数据库记录移动到23号记录上,但这种作用仅限于Paradox数据库,而不是dBA ...

  5. StringUtil

    package per.son.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.js ...

  6. java effective 读书笔记

    java effective 读书笔记 []创建和销毁对象 静态工厂方法 就是“封装了底层 暴露出一个访问接口 ” 门面模式 多参数时 用构建器,就是用个内部类 再让内部类提供构造好的对象 枚举 si ...

  7. dom paser

    dom paser /** * */ package ec.utils; import java.io.BufferedInputStream; import java.io.ByteArrayInp ...

  8. 估值十亿美元、1.5亿用户,公司CEO却跑路了

    转载这篇文章是觉得配图非常好玩的,文章的真实性有待证明 年收益3600万美元的.曾经拥有高口碑产品的Evernote,却正在把一手好牌打烂,距离IPO越来越远,屡屡被业界唱衰. "独角兽公司 ...

  9. java开发bug 在启动Tomcat 6.0时发现第一条信息便是

    MyEclipse 8.5 + tomcat6 + jdk 1.8 启动的时候报错: The APR based Apache Tomcat Native library which allows o ...

  10. Git版本控制

    官方文档:http://git-scm.com/book/en/v2 github :https://guides.github.com/activities/hello-world/ How to ...