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


Dr_Noooo
50 声望5 粉丝