关于Property中Copy属性的一个例子

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是不同的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值