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