gpt4 book ai didi

ios - 复制自定义数组而不指向 iOS ARC 中的旧数组

转载 作者:行者123 更新时间:2023-12-01 18:14:45 25 4
gpt4 key购买 nike

我想知道如何在不指向旧数组的情况下深度复制自定义数组。我检查了几乎所有堆栈溢出问题,但没有找到任何解决方案。请帮助复制数组而不指向旧数组,这样我的新数组操作(添加、删除)不会影响原始/旧数组。

这是我的主要数组声明。

@property (nonatomic, strong) NSArray *secArray;

将自定义对象添加到数组
      NSMutableArray *secDataArray = [NSMutableArray array];
[SetRequest.SetMembers enumerateObjectsUsingBlock:^(SetMember *member, NSUInteger idx, BOOL *stop) {

SecData *secData = [secDataArray lastObject];
if(!secData || ![secData.secTitle isEqualToString:member.setHeader])
{
secData = [secData secDataWithTitle:member.setHeader
lines:@[member]];
secData.open = YES;
[secDataArray addObject:secData];
}
else
{
[secData.lines addObject:member];
}
}];

self.secArray = [secDataArray copy];// copy secDatarray to my main array(secArray)

自定义数组的深度复制到新数组
 NSArray *newSecarray=[[NSMutableArray alloc] initWithArray:secArray copyItems:YES];

但是从新数组中删除数据也会从旧数组中删除数据。
SecData *dataoldarraydata = [self.secArray objectAtIndex:0];
SecData *datnewarraydata = [newSecarray objectAtIndex:0];

[datnewarraydata.rows removeLastObject];

NSLog (@"oldarraydata=%d",[secArray.lines count]); //Out Put = 33 (It should be 34 for as i don't want delete data from original array)
NSLog (@"newarraydata=%d",[newSecarray.lines count]); //Out Put = 33

//这是我的自定义 secData 类。

//secData.h 文件
@interface secData : NSObject

@property (nonatomic, strong) NSMutableArray *lines;
@property (nonatomic, strong) NSString *secTitle;
@property (nonatomic, strong) NSString *secIndexTitle;
@property (nonatomic, assign) BOOL open;

+ (id) secDataWithTitle:(NSString*)inTitle lines:(NSArray*)inLines;
+ (id) secDataWithLines:(NSArray*)inLines;
+ (id)copy;

@end

//secData.m 文件
#import "SecData.h"

@implementation SecData

@synthesize lines;

+ (id) secWithLines:(NSArray*)inLines
{
return [self secDataWithTitle:nil lines:inlines];
}

+ (id) secDataWithTitle:(NSString*)inTitle Lines:(NSArray*)inLines
{
SecData *sec = (SecData *)[[self alloc] init];
[sec setSecTitle:inTitle];

NSMutableArray *mutableCopyArray = [[NSMutableArray alloc] initWithArray:inLines];
[sec setLines:mutableCopyArray];

return sec;
}

- (NSMutableArray*)lines
{
if(! lines)
{
self. lines = [NSMutableArray array];
}
return lines;
}

- (void) setLines:(NSMutableArray *)aArray
{
NSMutableArray *newArray = aArray;

if(![aArray isKindOfClass:[NSMutableArray class]])
newArray = [NSMutableArray arrayWithArray:aArray];

lines = newArray;
}

- (id)copyWithZone: (NSZone *)zone
{
id seccopy = [[[self class] alloc]init];
if(seccopy ) {

NSMutableArray *temp = [[NSMutableArray alloc]initWithArray:self.lines copyItems:YES];

[seccopy setSecTitle:self.secTitle];
[seccopy setLines:self.lines];
}


return seccopy;
}

@end

最佳答案

如果您需要真正的深拷贝,那么还有一种方法可以存档然后取消存档集合。您将需要实现 NSCoding要归档/取消归档的类中的协议(protocol)。这不是一种有效的方法,但它确实提供了真正的深拷贝,即您的数组将完全不同。

使用此代码进行复制:

NSArray* newSecArray = [NSKeyedUnarchiver unarchiveObjectWithData:
[NSKeyedArchiver archivedDataWithRootObject:secArray]];

也可以看 Apple Docs关于浅拷贝和深拷贝。 Apple 还在其文档中说明了这种用于真正深度复制的方法。

这是 Archives and Serializations Programming Guide 的链接关于编码/解码对象。

关于ios - 复制自定义数组而不指向 iOS ARC 中的旧数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23210625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com