博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于Property中Copy属性的一个例子
阅读量:6693 次
发布时间:2019-06-25

本文共 1106 字,大约阅读时间需要 3 分钟。

Property关于内存管理的几个属性算是比较基础的问题了,直接上代码:

#import "ViewController.h"@interface ViewController ()@property (copy)  NSMutableString* myTest;@end@implementation ViewController- (void)viewDidLoad {    [super viewDidLoad];    NSMutableString* name=[[NSMutableString alloc] initWithString:@"fuck"];    [self initWithMyTestString:name];    NSLog(@"%ld",CFGetRetainCount((__bridge CFTypeRef)name)); //打印ARC引用计数    NSLog(@"%@",self.myTest);    [name appendString:@"hehe"];    NSLog(@"%@",self.myTest);}-(void)initWithMyTestString:(NSString*) aString{//    _myTest=aString;                      //情况1:输出 2 fuck and fuckhehe//    _myTest=[aString copy];               //情况2:输出 1 fuck and fuck    self.myTest=aString;                    //情况3:输出 1 fuck and fuck}

根据苹果官方文档对具有copy属性的property的行为的定义,它会拷贝一份instance,在这份新的instance上对引用计数加一。

情况1:直接使用instance variable进行赋值操作,这样使得myTest Property对aString进行了Strong引用,因此调用了initWithMyTestString后,对name的引用计数为2,myTest直接指向的是name,所以当name改变时,myTest也改变了;直接引用实例变量速度会更快,因为不需要调用消息,但会忽略property中对内存管理属性的要求!
情况2和情况3:通过这两种方式,都可以正确的对copy属性的变量进行赋值,得到预期的行为。也可以看出针对不同属性的Property,编译器生成的setter和getter是不同的。

转载地址:http://tbjoo.baihongyu.com/

你可能感兴趣的文章
带你实现开发者头条APP(三) 首页实现
查看>>
如何成为建数据库索引的高手?
查看>>
common-pools源码分析
查看>>
【JavaScript】script标签的属性
查看>>
Volley框架源码修改,添加头部验证Hreaders问题
查看>>
【Android开发】布局管理器-表格布局
查看>>
(业务层)异步并行加载ChangeLog
查看>>
数据结构
查看>>
Spring Boot 性能优化
查看>>
王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
查看>>
获取Android签名证书的公钥和私钥
查看>>
【hibernate框架】一对一双向外键关联(Annotation实现)
查看>>
HTML网页禁止鼠标操作脚本
查看>>
Android热修复简单总结
查看>>
K8S 生态周报| 2019.04.08~2019.04.14
查看>>
CSS 火焰?不在话下
查看>>
git 遇到The remote end hung up unexpectedly
查看>>
MySQL 千万级数据表 partition 实战应用
查看>>
设计模式--适配器模式(Adapter Pattern)
查看>>
谈谈我理解的Android组件化
查看>>