MST

星途 面试题库

面试题:Objective-C中浅拷贝与深拷贝在集合类中的表现差异

在Objective-C中,给定一个包含多个自定义对象的NSArray,对其进行浅拷贝和深拷贝操作后,分别打印出原数组、浅拷贝数组、深拷贝数组中每个对象的内存地址,并解释出现这些结果的原因。
11.0万 热度难度
编程语言Objective-C

知识考点

AI 面试

面试题答案

一键面试
#import <Foundation/Foundation.h>

// 自定义对象
@interface CustomObject : NSObject
@end

@implementation CustomObject
@end

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 创建包含多个自定义对象的NSArray
        NSMutableArray *originalArray = [NSMutableArray array];
        for (int i = 0; i < 3; ++i) {
            [originalArray addObject:[[CustomObject alloc] init]];
        }
        
        // 浅拷贝
        NSArray *shallowCopyArray = [originalArray copy];
        
        // 深拷贝
        NSArray *deepCopyArray = [NSMutableArray arrayWithArray:originalArray copyItems:YES];
        
        // 打印原数组对象内存地址
        NSLog(@"原数组对象内存地址:");
        for (CustomObject *obj in originalArray) {
            NSLog(@"%p", obj);
        }
        
        // 打印浅拷贝数组对象内存地址
        NSLog(@"浅拷贝数组对象内存地址:");
        for (CustomObject *obj in shallowCopyArray) {
            NSLog(@"%p", obj);
        }
        
        // 打印深拷贝数组对象内存地址
        NSLog(@"深拷贝数组对象内存地址:");
        for (CustomObject *obj in deepCopyArray) {
            NSLog(@"%p", obj);
        }
        
        // 结果解释
        /*
         - 原数组:存放了自定义对象的内存地址。
         - 浅拷贝数组:浅拷贝对于不可变对象(如NSArray)是指针拷贝,即浅拷贝数组和原数组指向同一块内存区域,所以浅拷贝数组中的对象内存地址与原数组相同。
         - 深拷贝数组:深拷贝会递归地拷贝数组中的每个对象,所以深拷贝数组中的对象内存地址与原数组不同,是新创建的对象的内存地址。
         */
    }
    return 0;
}
  1. 原数组:存放自定义对象实例的内存地址。
  2. 浅拷贝数组:浅拷贝是指针拷贝,新数组和原数组指向同一块内存区域,所以浅拷贝数组中的对象内存地址与原数组相同。
  3. 深拷贝数组:深拷贝会递归地拷贝数组中的每个对象,所以深拷贝数组中的对象是新创建的,内存地址与原数组不同。