Foundation5 NSObject和反射,copy语法

本文详细探讨了Foundation5框架中NSObject类的重要特性,包括其常用方法的使用,特别是反射机制和copy属性的工作原理。通过实例解析,帮助读者深入掌握NSObject在Objective-C编程中的核心应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NSObject常用方法

    Student *stu = [[[Student alloc] init] autorelease];
    
    // isKindOfClass判断对象是否属于某个类 或者 子类
    if ( [stu isKindOfClass:[Person class]] ) {
        // NSLog(@"stu属于Person或者继承自Person");
    }
    
    // isMemberOfClass判断对象是否属于某个类(不包括子类)
    BOOL result = [stu isMemberOfClass:[Student class]];
    // NSLog(@"%i", result);
    
    
    // 直接调用
    // [stu test];
    
    // 间接调用
    [stu performSelector:@selector(test)];
    // [stu performSelector:@selector(test2:) withObject:@"abc"];
    // 延迟2秒后调用test2:方法
    [stu performSelector:@selector(test2:) withObject:@"abc" afterDelay:2];

类的反射

    NSString *str = @"Person";
    Class class = NSClassFromString(str);
    
    Person *person = [[class alloc] init];
    NSLog(@"%@", person);
    
    
    // Class变成字符串
    NSString *name =  NSStringFromClass([Person class]);
    
    
    // 方法的反射
    NSString *method = @"test";
    SEL selector = NSSelectorFromString(method);
    [person performSelector:selector];
    
    // 将SEL转换为字符串
    NSString *selectorName = NSStringFromSelector(selector);
    
    [person release];

copy语法的目的:改变副本的时候,不会影响到源对象


copy语法存在深拷贝和浅拷贝问题
深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
只有一种情况是浅拷贝:不可变对象调用copy方法时是浅拷贝


演示字符串的拷贝(深拷贝)

    // string:1
    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    
    // 产生了一个新的对象,计数器为1。源对象的计数器不变。
    // str:1
    // string:1
    NSMutableString *str = [string mutableCopy];
    //NSLog(@"str:%zi", [str retainCount]);
    //NSLog(@"string:%zi", [string retainCount]);
    
    // str和string不是相同对象
    // NSLog(@"%i", str == string);
    
    [str appendString:@" abcd"];
    
    NSLog(@"string:%@", string);
    NSLog(@"str:%@", str);
    
    // str:0
    [str release];
    // string:0
    [string release];

演示字符串的拷贝(浅拷贝)

    NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
    NSLog(@"%zi", [string retainCount]);
    
    // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
    // 源对象计数器会+1
    // 在浅拷贝情况下,copy其实就相当于retain
    NSString *str = [string copy];
    NSLog(@"%zi", [string retainCount]);
    
    // NSLog(@"%i", str == string);
    
    [str release];
    [string release];


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dwt1220

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值