• 属性修饰符


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

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

  • 相关阅读:
    JS的冒泡事件
    Java基础之断言
    Spring中AOP切面编程学习笔记
    如何将Excel导入到Mysql数据库中
    关于数据库分析较好的文章汇总
    Spring 事务相关点整理
    spring中scope的prototype与singleton区别
    设计模式学习(三)——单例模式
    Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.******.seashell.bpc.query.query.service.FscBankPayCodeQueryService
    ArrayList源码解读笔记
  • 原文地址:https://www.cnblogs.com/pioneerMax/p/6474783.html
Copyright © 2020-2023  润新知