美文网首页
(六) [OC高效系列]弄清楚属性

(六) [OC高效系列]弄清楚属性

作者: 修行猿 | 来源:发表于2016-08-10 11:16 被阅读37次

1.copy mutable copy

  • NSString与NSMutableString
 NSString *title = @"aaa";
    NSLog(@"title %p",title);
    NSLog(@"title copy %p",[title copy]);
    NSLog(@"title mutable copy %p",[title mutableCopy]);
 
    NSMutableString *titleMutable = [NSMutableString string];
    NSLog(@"titleMutable %p",titleMutable);
    NSLog(@"titleMutable copy %p",[titleMutable copy]);
    NSLog(@"titleMutable copy %p",[titleMutable mutableCopy]);

打印如下

2016-08-10 10:46:59.251 Test1[1500:80994] title 0x108d74068
2016-08-10 10:46:59.252 Test1[1500:80994] title copy 0x108d74068
2016-08-10 10:46:59.252 Test1[1500:80994] title mutable copy 0x7fbedb721ca0
2016-08-10 10:46:59.252 Test1[1500:80994] titleMutable 0x7fbedb49ca40
2016-08-10 10:46:59.252 Test1[1500:80994] titleMutable copy 0x109a45280
2016-08-10 10:46:59.252 Test1[1500:80994] titleMutable copy 0x7fbedb4975b0
  • NSValue
    NSValue *value = [NSValue valueWithCGSize:(CGSizeMake(1, 1))];
    NSLog(@"value %p",value);
    NSLog(@"value copy %p",[value copy]);
    //    NSLog(@"value mutable copy %p",[value mutableCopy]);  //无此方法

打印如下

2016-08-10 10:46:59.252 Test1[1500:80994] value 0x7fbedb4068e0
2016-08-10 10:46:59.252 Test1[1500:80994] value copy 0x7fbedb4068e0
  • NSArray与 mutableArray
    NSArray *array = [NSArray array];
    NSLog(@"array %p",array);
    NSLog(@"array copy %p",[array copy]);
    NSLog(@"array mutable copy %p",[array mutableCopy]);
  
    NSMutableArray *mutableArray = [NSMutableArray array];
    NSLog(@"mutableArray %p",mutableArray);
    NSLog(@"mutableArray copy %p",[mutableArray copy]);
    NSLog(@"mutableArray mutable copy %p",[mutableArray mutableCopy]);

打印如下

2016-08-10 10:46:59.253 Test1[1500:80994] array 0x7fbedb501410
2016-08-10 10:46:59.253 Test1[1500:80994] array copy 0x7fbedb501410
2016-08-10 10:46:59.253 Test1[1500:80994] array mutable copy 0x7fbedb481620
2016-08-10 10:46:59.253 Test1[1500:80994] mutableArray 0x7fbedb71ba70
2016-08-10 10:46:59.253 Test1[1500:80994] mutableArray copy 0x7fbedb501410
2016-08-10 10:46:59.253 Test1[1500:80994] mutableArray mutable copy 0x7fbedb610b50
  • NSDictionary与NSMutableDictionary
    NSDictionary *dic = [NSDictionary dictionary];
    NSLog(@"dic %p",dic);
    NSLog(@"dic copy %p",[dic copy]);
    NSLog(@"dic mutable copy %p",[dic mutableCopy]);
    
    NSMutableDictionary *mutableDic = [NSMutableDictionary dictionary];
    NSLog(@"mutableDic %p",mutableDic);
    NSLog(@"mutableDic copy %p",[mutableDic copy]);
    NSLog(@"mutableDic mutable copy %p",[mutableDic mutableCopy]);

打印如下

2016-08-10 10:46:59.253 Test1[1500:80994] dic 0x7fbedb5007a0
2016-08-10 10:46:59.253 Test1[1500:80994] dic copy 0x7fbedb5007a0
2016-08-10 10:46:59.253 Test1[1500:80994] dic mutable copy 0x7fbedb710000
2016-08-10 10:46:59.253 Test1[1500:80994] mutableDic 0x7fbedb51eee0
2016-08-10 10:46:59.254 Test1[1500:80994] mutableDic copy 0x7fbedb5007a0
2016-08-10 10:46:59.254 Test1[1500:80994] mutableDic mutable copy 0x7fbedb610b50
  • 总结
不可变对象copy,不会分配新的内存空间
不可变对象mutableCopy,会分配新的内存空间
可变对象copy和mutableCopy,都会生成新的内存空间

以上结论仅对上面出现的Foundation类有效,其他对象要看其copy mutableCopy协议具体的实现方式

2.NSString类型的属性为什么用copy,而不用retain

是为了防止该属性赋一个NSMutableString类型的值,然后被外界改变,影响到该属性的值,比如

//声明两个属性
@property (nonatomic,copy) NSString *titleCopy;
@property (nonatomic,retain) NSString *titleRetain;

//implementation
    NSMutableString *str = [NSMutableString stringWithString:@"aaa"];
    self.titleCopy = str;
    self.titleRetain = str;
    [str appendString:@"bbb"];
    NSLog(@"str : %@",str);
    NSLog(@"title copy : %@",self.titleCopy);
    NSLog(@"title retain : %@",self.titleRetain);

打印如下

**2016-08-10 11:10:20.829 Test1[1563:97056] str : aaabbb**
**2016-08-10 11:10:20.829 Test1[1563:97056] title copy : aaa**
**2016-08-10 11:10:20.829 Test1[1563:97056] title retain : aaabbb**

可见copy类型的属性的属性值并没有受原来值改变的影响
而retain类型的属性的属性值受到了影响

3.其他内存管理的语义

assign

只会针对纯量类型进行简单赋值操作

strong

一种拥有关系。设置方法会先保留新值,并释放旧值,再将新值设置上去

weak

非拥有关系。设置方法既不保留新值也不释放旧值,当属性所指对象时,属性值也会被清空

unsafe_unretained

非拥有关系,但当属性所指对象释放时不会自动清空。不安全。

相关文章

  • (六) [OC高效系列]弄清楚属性

    1.copy mutable copy NSString与NSMutableString 打印如下 NSValue...

  • OC由浅入深系列 之 属性

    一、什么是属性 在OC中,用@property 关键字修饰的类的成员成为属性。 在属性出现之前,声名一个实例变量通...

  • (七) [OC高效系列]直接访问和属性访问

    1.直接访问 好处 坏处 2.属性访问 好处 3.初始化和销毁方法中应该使用直接访问 4.对于懒加载的属性应该通过...

  • OC get set 方法理解

    OC get set 方法理解 get set方法不能同时重写 最近在了解oc的属性,oc的属性组成是由成员变量+...

  • 属性 - OC

    atomic原子操作。原子性是指事务的一个完整操作,在objective-c 属性设置里面默认的就是atomic,...

  • OC:属性

    目录 属性演变过程 属性定义 属性扩展 属性演变过程 上篇博文《OC学习备忘录:成员变量、方法》中演示了如何声明成...

  • (三十-三十五)[OC高效系列]

    30.在dealloc方法中只释放引用并解除监听 在dealloc方法里,应该做的事情就是释放指向其他对象的引用,...

  • (二十五)[OC高效系列]勿在分类中声明属性

    1.除了主分类,其他分类中声明的属性不会生成实质的成员变量,只会生成对应的setter和getter方法。 2.那...

  • OC系列教程之属性调用方式

    参考:https://blog.csdn.net/u013378438/article/details/44200...

  • iOS属性

    什么是属性 属性是OC语言中的一个机制,我们在OC中用@property来声明一个属性,其实@property是一...

网友评论

      本文标题:(六) [OC高效系列]弄清楚属性

      本文链接:https://www.haomeiwen.com/subject/khxjsttx.html