可变类型属性与copy

代码:

@import Foundation;

/**************************************************
 *  Man类
 **************************************************/
@interface Man : NSObject

// 潜在风险:使用属性修饰符copy修饰一个可变类型的属性
@property (copy, nonatomic) NSMutableString *name;

@end

@implementation Man

@end

/**************************************************
 *  main函数
 **************************************************/
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        NSMutableString *nameMutableString = [NSMutableString stringWithString:@"AAA"];

        Man *man = [[Man alloc] init];

        // 通过属性的set方法给属性赋值后,属性值的实际类型都将是不可变的类型,其执行效果类似于如下语句
        // man->_name = nameMutableString.copy;
        man.name = nameMutableString;

        // 属性的类型不再是可不变类型
        NSLog(@"[man.name isKindOfClass:NSMutableString.class] = %@", [man.name isKindOfClass:NSMutableString.class]  ? @"YES" : @"NO");
        NSLog(@"[man.name isKindOfClass:NSString.class] = %@", [man.name isKindOfClass:NSString.class]  ? @"YES" : @"NO");

        // 执行如下语句,程序可能会崩溃
        // [man.name setString:@"BBB"];
    }
    return 0;
}

输出:

[man.name isKindOfClass:NSMutableString.class] = NO
[man.name isKindOfClass:NSString.class] = YES

总结:

谨慎使用属性修饰符copy修饰一个可变类型的属性

时间: 2024-12-16 18:15:59

可变类型属性与copy的相关文章

关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/不可变对象: 4.Objective-C中的copy与mutableCopy方法. 一.指针与对象 在初始学习编程的时候,对于绝大多数面向对象编程的语言,这都是个绕不开的重点与难点.非常惭愧的是对它的认识我一直是不够的,并且感觉这项技术有许多的内容可以挖掘.说这是面向对象编程的核心思想也不为过.很多

java 不可变类型

1. java不可变性初探 我们先看下面一个例子:代码如下: 1 import java.math.BigInteger; 2 public class BigProblem { 3 public static void main(String[ ] args) { 4 BigInteger fiveThousand = new BigInteger("5000"); 5 BigInteger fiftyThousand = new BigInteger("50000&quo

java中的不可变类型的探究

不可变类是指创建类的对象实例后,该实例的属性不能发生改变.常见的String就是不可变类.不可变类型的属性值不会发生改变,这在多线程编程的时候非常有用,不用担心对象的属性值被修改. 下面我们来看看如何实现一个不可变类型: 1.要保证属性值不发生改变,属性必须用private和final修饰. 2.要在类的构造函数中初始化final属性,并且只提供getter方法,不提供setter方法. 3.重写equals和hashCode,使用重写的equals方法根据属性值判断两个对象是否相等,hashC

python可变类型和不可变类型

原文地址:http://www.cnblogs.com/huamingao/p/5809936.html 可变类型 Vs 不可变类型 可变类型(mutable):列表,字典 不可变类型(unmutable):数字,字符串,元组 这里的可变不可变,是指内存中的那块内容(value)是否可以被改变 代码: name1='wupeiqi' name2=name1 print("name1:%s\nname2:%s" %(name1,name2)) name1='alex' print(&qu

python —— 可变与不可变类型

可变与不可变类型对象 可变和不可变,本质上就是改变了里面的数据后,内存地址是否有改变 可变类型.不可hash 不可变类型,可hash 列表 字符串 字典 数字 集合 元组   不可变的集合 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址. 可变对象,该对象所指向的内存中的值可以被改变.变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并

linux 可变类型与不可变类型

Python的每个对象都分为可变和不可变,主要的核心类型中,数字.字符串.元组是不可变的,列表.字典是可变的. 可变类型和不可变类型有些地方区别很大,注意区分. 对不可变类型的变量重新赋值,实际上是重新创建一个不可变类型的对象,并将原来的变量重新指向新创建的对象(如果没有其他变量引用原有对象的话(即引用计数为0),原有对象就会被回收). 不可变类型 以int类型为例:实际上 i += 1 并不是真的在原有的int对象上+1,而是重新创建一个value为6的int对象,i引用自这个新的对象. 可以

.net基础扫盲--可变类型(var,dynamic)

之所以要谈及var和dynamic,是因为在使用EF框架和使用MVC的时候,会很频繁的用到他们,所以不得不提他们,以便在接触EF和MVC的时候能够很好的理解和熟练的应用. 先简单说一下var,虽被称作是可变类型,但他并不是一种若类型,只不过他是通过程序推断来确定类型的. 我们可以这么写: static void Main(string[] args) { var i = 10; //经过程序的推断,i最终被推断为 int整型 var j = "10";//同样,经程序推断为字符型 Co

OC中NSString和block的属性时copy,而不用retain

OC中NSString和block的属性时copy,而不用retain   而容器类使用retain NSString 为什么要使用copy,而不是retain 1.首先如果使用retain,只是引用计数+1,并没有生成新的对象,所以效率好 2.但是使用copy安全.因为NSString为NSMutableString 的基类,如果将NSMutableString 以retain的形式赋值给NSString后,后续修改NSMutableString会导致NSString内容的变化,这通常不是我们

MVC自定义编辑视图,DateTime类型属性显示jQuery ui的datapicker

实现的效果为:在编辑视图中,对DateTime类型的属性,显示jQuery UI的datepicker.效果如下: Student.cs public class Student    {        public int Id { get; set; }        public string Name { get; set; }        public DateTime? JoinTime { get; set; }    } HomeController: public class