• OC——Foundation—常用的类(5)——NSObject和反射、copy语法


    反射:
    OC反射机制是指:在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,这种动态获取信息以及动态调用对象的方法的功能成为OC的反射机制。
    Class反射
    通过类名的字符串形式实例化对象
    将类名变成字符串
    SEL的反射
    通过方法的字符串形式实例化方法
    将方法变成字符串
    //类名的反射
    NSString *str=@“Person”;
    Class class=NSClassFromString(str);
    Person *person=[[class alloc]init];
    
    //类转换为字符串
    NSString *name=NSStringFromClass([Person clas]);
    
    //方法的反射
    NSString *method=@“test”;
    SEL selector=NSSelectorFromString(method);
    [person performSelector:selector];
    
    //将方法转换为字符串
    NSString *selectorname=NSStringFromSelector(selector);
    copy和mutableCopy(copy语法的目的是:改变副本不影响源对象)
    • 一个对象使用copy或mutableCopy方法可以创建对象的副本
    • copy-需要先实现NSCopying协议,创建的是不可变的副本(如NSString、NSArray、NSDictionary)
    • mutableCopy-需要先实现NSMutableCopying协议,创建的时可变的副本(如NSMutableString、NSMutableArray、NSMutableDictionary)
    • 深复制:内容拷贝,源对象和副本指向的是不同的两个对象。源对象引用计数器不变,副本计数器设置为1(本质是看是否产生新的对象
    • 浅复制:指针拷贝,源对象和副本指向的是同一个对象。对象的引用计数器+1,其实相当于做了一次retain操作(本质是看产生的对象是否与源对象相同
    • 只有不可变的对象创建不可变副本才是浅复制
    调用copy或mutableCopy方法产生的副本与源对象无关,只于对象调用的方法有关
    copy语法示例:
    NSString *str1=[[NSString alloc]initWithFormat:@“age is 10”];
    NSString *str2=[str1 copy];
    //copy出来的还是原来的对象,没有产生新的对象
    MutableCopy示例:
    NSString *str=[[NSString alloc]initWithFormat:@“age is 10”];
    NSMutableString *str1=[str MutableCopy];
    //产生了新的对象,因此是深度复制
     
    copy语法注意事项:
    如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法
    如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法
    以copy为例,建议用[self class]代替直接类名
     
  • 相关阅读:
    一个docker容器中运行多个服务还是弄一堆docker容器运行?
    golang配置 GoGetProxyConfig,goproxy.io的介绍
    Docker下运行Mysql报错 mbind: Operation not permitted
    linux允许root用户远程登录
    docker-compose 安装 mysql并初始化用户与sql文件
    spring报错 xxxxxxxxxxxx has been injected into other beans
    mysql报错[Warning] IP address 'xxxx' could not be resolved: Name or service not known错误解决
    idea 高效找出全部未被使用的代码
    springboot配置Filter的两种方法
    .net core Elasticsearch 查询更新
  • 原文地址:https://www.cnblogs.com/hqzxbb/p/4425072.html
Copyright © 2020-2023  润新知