属性修饰符

1.字符串为什么要用copy和strong的区别

使用copy会重新开辟一块内存空间用来存储,不受原来对象的的影响,测试代码如下

strong修饰:

@property(nonatomic,strong) NSString *name;

NSMutableString *str = [NSMutableString string];
    [str appendString:@"hello"];
    self.name = str;
    [str appendString:@"world"];
    NSLog(@"%@",self.name);

打印结果是:helloworld

copy修饰

@property(nonatomic,copy) NSString *name;

NSMutableString *str = [NSMutableString string];
    [str appendString:@"hello"];
    self.name = str;
    [str appendString:@"world"];
    NSLog(@"%@",self.name);

打印结果是:hello

2.block作为属性为什么要使用copy修饰

第一种block

void (^demo)() = ^{
        NSLog(@"aaaaa");
    };
    NSLog(@"%@",demo);

打印结果为:<__NSGlobalBlock__: 0x10009c2c0>(这是一个全局的block,全局block存储在内存中的代码区,一般情况block也不会这么使用)

第二种block

ARC情况下  

 int number = 1;
    void (^demo)() = ^{
        NSLog(@"aaaaa = %d",number);
    };
    NSLog(@"%@",demo);

打印结果为:<__NSMallocBlock__: 0x170250e30>(这种block存储在内存中的堆区)

MRC情况下

 int number = 1;
    void (^demo)() = ^{
        NSLog(@"aaaaa = %d",number);
    };
    NSLog(@"%@",demo);

打印结果为:<__NSStackBlock__: 0x16fd3df28>(栈block,这种block存储在内存中的栈区)

第三种block

int number = 1;
    void (^demo)() = ^{
        NSLog(@"aaaaa = %d",number);
    };
    NSLog(@"%@",[demo copy]);

打印结果为:<__NSMallocBlock__: 0x1744406c0>(堆block)

//测试

@property(nonatomic,assign) void (^myBlock)();

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    [self test];
    self.myBlock();
    self.myBlock();
}

- (void)test{
    int n = 1;
    [self setMyBlock:^{
        NSLog(@"%d",n);
    }];
     NSLog(@"%@",self.myBlock);
}

使用assign修饰的打印结果是<__NSStackBlock__: 0x16fd31f18>  1,有时候会发生奔溃

使用copy修饰的打印结果是<__NSMallocBlock__: 0x170243bd0>1 1,正常输出结果

3.其他修饰符

retain 在mrc中使用,strong在arc中使用,weak只有在arc中才使用,assign在arc和mrc中都可以使用,copy在arc和mrc中都可以使用。

weak一般修饰对象,assign一般修饰基本数据类型,weak修饰的对象销毁之后会指向nil,assign修饰的对象销毁之后不会指向nil会导致野指针操作。

如有错误之处欢迎指正!!!

posted @ 2017-02-27 16:16  LSPBoy  阅读(126)  评论(0编辑  收藏  举报