面试题答案
一键面试在Objective-C中实现一个包含NSString
、NSArray
等类型属性的类的深拷贝,可以按照以下步骤进行:
- 确保类遵循
NSCopying
协议。 - 实现
copyWithZone:
方法来进行深拷贝。
以下是一个示例代码:
#import <Foundation/Foundation.h>
@interface MyCustomClass : NSObject <NSCopying>
@property (nonatomic, strong) NSString *stringProperty;
@property (nonatomic, strong) NSArray *arrayProperty;
@end
@implementation MyCustomClass
- (id)copyWithZone:(NSZone *)zone {
MyCustomClass *copy = [[[self class] allocWithZone:zone] init];
if (copy) {
// 深拷贝NSString属性
copy.stringProperty = [self.stringProperty copy];
// 深拷贝NSArray属性及其内容
NSMutableArray *mutableCopyArray = [NSMutableArray arrayWithCapacity:self.arrayProperty.count];
for (id object in self.arrayProperty) {
if ([object conformsToProtocol:@protocol(NSCopying)]) {
[mutableCopyArray addObject:[object copy]];
}
}
copy.arrayProperty = [NSArray arrayWithArray:mutableCopyArray];
}
return copy;
}
@end
实现过程中需要注意的问题:
- 遵循NSCopying协议:确保自定义类遵循
NSCopying
协议,这样才能实现深拷贝方法。 - NSString的拷贝:
NSString
是不可变的,使用copy
方法进行拷贝即可。这会创建一个新的字符串对象,内容与原字符串相同。 - NSArray的拷贝:对于
NSArray
,不仅要拷贝数组本身,还要对数组中的每个对象进行拷贝。首先创建一个可变数组NSMutableArray
,遍历原数组,对每个对象进行拷贝(前提是对象遵循NSCopying
协议),然后再将可变数组转换为不可变数组赋值给新对象的arrayProperty
。 - 对象一致性:确保数组中的对象都遵循
NSCopying
协议,否则在拷贝时可能会出现异常。如果数组中包含自定义对象,这些自定义对象也需要实现NSCopying
协议。 - 内存管理:在深拷贝过程中,要注意内存的分配和释放,避免内存泄漏。通过正确的内存管理方法(如ARC自动引用计数或手动引用计数)来确保对象的生命周期正确管理。
- 自定义对象属性:如果类中还包含其他自定义对象属性,同样需要对这些属性进行深拷贝。这些自定义对象也需要实现
NSCopying
协议,以确保能够正确拷贝。