天天看点

NSObject常用方法 和反射

一. NSObject 常用方法

1. 判断一个对象是否属于某个类或子类

[对象 isKindOfClass:[类名]];  返回 BOOL 值

2. isMemberOfClass判断对象是否属于某个类(不包括子类)

[[对象名 isMemberOfClass: [类名 class]]; 返回 BOOL 值

3. 判断对象是否实现了 aProtocol 协议

-(BOOL)conformsToProtocol: (Protocol)aProtocol;

4. 判断对象是否拥有参数提供的方法

–      (BOOL)respondsToSelector:(SEL)aSelector;

5.延迟调用参数提供的方法,方法所需参数用 withObject 传入

-(void)performSelector: (SEL)aSelector withObject: (id)anArgument afterDelay: (NSTimeInterval)delay;

二.反射

1.类名的反射

NSString*str = @”Person”;

Classclass = NSClassFromString(str);

Person*person = [[class alloc]init];

[personrelease];

2.Class变成字符串

NSString*name = NSStringFromClass([Person class]);

3.方法的反射

NSString*method = @”test”;

SEL selector= MSSelectorFromString(method);

[personperSelector: (selector)];

1. 将 SEL 转化为字符串

NSStringFromSelector(@selector(setName));

三 Copy 的使用

1.copy的目的:改变副本的时候不会影响原对象

2.深拷贝:内容拷贝,源对象和副本指向的是不同的两个对象.源对象引用计数器不变,副本计数器设置为1.

3.浅复制:指针拷贝,源对象和副本指向的是同一个对象,对象的引用计数器+1,其实相当于做了一次 retain 操作.

只有不可变对象创建不可变副本(copy)才是浅复制,其他都深复制.

4.一个对象使用 copy 或 mutableCopy 方法可以创建对象的副本

5.copy-需要先实现 NSCoppying 协议,创建的是不可变副本(如 NSString,NSArray,NSDictionary)

6.mutaleCopy-需要先实现NSMutableCopying 协议,创建得到是可变副本(如 NSMutableString,NSMutableArray,NSMutableDictionary)

复制的时候,复制的结果与源对象无关,与复制的方式有关.

#import <Foundation/Foundation.h>
#import "Student.h"
#import "GoodStudent.h"
// copy语法的目的:改变副本的时候,不会影响到源对象
#pragma mark 演示字符串的拷贝(深拷贝)
// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
void stringMutableCopy() {
    // 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];
}
#pragma mark 演示字符串的拷贝(浅拷贝)
// 只有一种情况是浅拷贝:不可变对象调用copy方法时

// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
void stringCopy() {
    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];
}

#pragma mark 可变字符串的copy(深拷贝)
void mutableStringCopy() {
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
    // 会产生一个新对象,str计数器为1
    NSString *str = [string copy];
    [str release];
}

#pragma mark 可变字符串的MutableCopy(深拷贝)
void mutableStringMutableCopy() {
    NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10];
    // 会产生一个新对象,str计数器为1
    NSMutableString *str = [string mutableCopy];
    [str appendString:@"1234"];
    
    NSLog(@"str:%@", str);
    NSLog(@"string:%@", string);
    
    [str release];
}