免费开源的iOS开发学习平台

OC对象Object:2-对象操作

针对对象的常见操作,主要包括:判断对象的类型、判断对象是否响应消息、对象间的比较以及对象复制。

1、判断对象的类型

对象通过调用isKindOfClass:方法,可以用来判断对象的类型。isKindOfClass:方法是NSObject类的方法,将类型为Class的对象aClass作为参数传入,返回一个BOOL类型的返回值。

- (BOOL)isKindOfClass:(Class)aClass;

例如,下面的代码用来判断对象str是否是NSString类型,如果是NSString类型,则打印一段日志。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //使用类方法创建字符串对象
        NSString *str = [NSString stringWithFormat:@"www.99ios.com"];
        //判断对象的类
        if ([str isKindOfClass:[NSString class]]) {
            NSLog(@"str是NSString类型的对象!");
        }
    }
    return 0;
}

运行结果:

另外,isKindOfClass:方法还可以用于判断子类对象的类型,如下面的代码所示,NSMutableString是NSString的子类,代码执行后,isKindOfClass:方法也会认定mutableStr对象也是属于NSString类型。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableString *mutableStr = [NSMutableString string];
        if ([mutableStr isKindOfClass:[NSString class]]) {
            NSLog(@"mutableStr是NSString类型的对象!");
        }
    }
    return 0;
}

运行结果:

2、判断对象是否响应消息

在Objective-C中,调用对象的方法需要向对象发送消息,这是Objective-C语言的重要特征。要判断一个对象是否响应一条消息,则可以调用respondsToSelector:方法。应用程序通常在验证一个对象响应一则消息后,才将消息发送给该对象。

这种机制,常常用于代理中,先判断代理对象是否响应代理方法,如果响应,则代表代理对象中已经实现了代理方法,然后再通知代理对象执行代理方法。

示例代码:

  • 在自定义类MYClass.h文件中,添加一个name属性
#import <Foundation/Foundation.h>
@interface MYClass : NSObject 
@property (nonatomic, copy) NSString * name;
@end
  • 在自定义类MYClass.m文件中,对属性进行懒加载(getter方法)
-(NSString *)name{
    if (_name == nil) {
        _name = @"99ios";
    }
    return _name;
}
  • 在main()中,判断自定义类是否实现了属性的getter方法
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //判断对象是否响应消息
        MYClass *obj = [[MYClass alloc] init];
        if ([obj respondsToSelector:@selector(name)]) {
            NSLog(@"obj可以响应名称为name的消息!");
        }
    }
    return 0;
}

运行结果:

3、对象比较

当需要对比两个对象是否相同时,可以使用isEqual:方法。如果相同,则该方法返回YES。该方法是在NSObject类中定义的,因此所有的对象都可以调用这个方法。另外,在最常用的Foundation框架中,也提供了isEqualToString:或者isEqualToDictionary:等方法,在实际开发中使用更加广泛一些。

- (BOOL)isEqual:(id)object;

下方的示例代码中,对字符串进行了比较操作,使用了isEqual:方法以及isEqualToString:方法。

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str1 = [NSString stringWithFormat:@"www.99ios.com"];
        NSString *str2 = @"九九学院";
        //对象比较
        if ([str1 isEqual:str2]) {
            NSLog(@"str1 与 str2 相同!");
        }else {
            NSLog(@"str1 与 str2 不相同!!");
        }
        if ([str1 isEqualToString:@"www.99ios.com"]) {
            NSLog(@"str1 与字符串 \"www.99ios.com\"相同!");
        }
    }
    return 0;
}

运行结果:

4、对象复制

通过调用copy方法,可以创建对象的副本。调用copy方法,有个前提条件,即接收的对象的类必须遵守NSCopying协议。另外,在使用对象复制时,还需要考虑针对该对象是深复制(对象复制),还是浅复制(指针复制),有关深复制与浅复制后续会详细介绍。

下面的示例代码中,对NSString类型的字符串对象进行复制,NSString类在定义中遵守了NSCopying协议。

@interface NSString : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>  //遵守了NSCopying协议
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str = [NSString stringWithFormat:@"www.99ios.com"];
        //对象复制
        NSString *copyString = [str copy];
        NSLog(@"copyString 的值 :%@ ",copyString);
    }
    return 0;
}

示例代码

https://github.com/99ios/3.4.2