zoukankan      html  css  js  c++  java
  • 属性修饰符

    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会导致野指针操作。

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

  • 相关阅读:
    【Nginx】Nginx性能优化及配置文件
    【算法】常见算法分类和思想
    【PHP】php位运算及其高级应用
    【数据结构】数据结构-图的基本概念
    【Redis】Redis缓存穿透解决方案之布隆过滤器
    【Linux】Linux系统5种IO模型
    【linux】/dev/null作用和/dev/random
    【Linux】Linux查找功能
    【算法】算法复杂度
    Docker Hub公共镜像仓库的使用
  • 原文地址:https://www.cnblogs.com/pioneerMax/p/6474783.html
Copyright © 2011-2022 走看看