• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 如何在 Objective-C 中复制自定义对象?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 09:30:03 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我有两个数组。首先包含自定义对象。现在我想将第一个数组的所有对象复制到另一个数组中。为此,我使用以下代码。

数组。

arr_post=[[NSMutableArray alloc]init];
copy_arr_user_post=[[NSMutableArray alloc]init];

我正在像这样将对象添加到其中。

for(i=0;i<[arr_main count];i++)
{
    Post *obj=[[Post alloc]init];
    obj.name=@"abc";
    obj.category=@"social";
   [arr_post addObjectbj];


}

现在我像这样复制到另一个数组

 [arr_post addObject:user_post];
 Post *objectCopy = [user_post copy]; //create a copy of our object
 [copy_arr_user_post addObject: objectCopy]; //insert copy into other array

在 Post.h 中

@interface Post : NSObject<NSCopying>

在 Post.m 中

- (id)copyWithZoneNSZone *)zone
{
    // Copying code here.
    Post *another =[[[self class] allocWithZone:zone] init];
    another.id=self.id;
    another.category=self.category;
    return another;
}

但它不会复制我得到空值的对象。为什么?



Best Answer-推荐答案


我发现一种比 NSCopyng 更快的方法

-用这两种方法创建一个NSObject类

#import <objc/runtime.h>
-(id)deepCopy
{
NSArray *tmpArray = @[self];
NSData *buffer = [NSKeyedArchiver archivedDataWithRootObject:tmpArray];
return [NSKeyedUnarchiver unarchiveObjectWithData:buffer][0];
}

- (NSMutableArray *)allProperties
{
    NSMutableArray *props = [NSMutableArray array];
    unsigned int outCount, i;
    objc_property_t *properties = class_copyPropertyList([self class], &outCount);
    for (i = 0; i < outCount; i++) {
        objc_property_t property = properties[i];

        //Excluding all readOnly properties
        unsigned int numOfAttributes;
        objc_property_attribute_t *propertyAttributes = property_copyAttributeList(property, &numOfAttributes);

        BOOL foundReadonly = NO;

        for ( unsigned int ai = 0; ai < numOfAttributes; ai++ )
        {
            switch (propertyAttributes[ai].name[0]) {
                case 'T': // type
                    break;
                case 'R': // readonly
                    foundReadonly = YES;
                    break;
                case 'C': // copy
                    break;
                case '&': // retain
                    break;
                case 'N': // nonatomic
                    break;
                case 'G': // custom getter
                    break;
                case 'S': // custom setter
                    break;
                case 'D': // dynamic
                    break;
                default:
                    break;
            }
        }
        free(propertyAttributes);

        if (!foundReadonly)
        {
            NSString *propertyName = [[NSString alloc] initWithCString:property_getName(property) encoding:NSASCIIStringEncoding];
            [props addObject:propertyName];
        }
    }
    free(properties);
    return props;
}

-让你的对象符合 NSCoding

#pragma mark - NSCoding
- (instancetype)initWithCoderNSCoder *)decoder {
    self = [super init];
    if (self)
    {
        NSArray *keys = [self allProperties];

        for (NSString *key in keys)
        {
            [self setValue:[decoder decodeObjectForKey:key] forKey:key] ;
        }

    }
    return self;
}
- (void)encodeWithCoderNSCoder *)aCoder
{
    NSArray *keys = [self allProperties];

    for (NSString *key in keys)
    {
        [aCoder encodeObject:[self valueForKey:key] forKey:key];
    }
}

-导入类别

现在您可以复制任何类型的对象

MYObject *copy = [originalObject deepCopy];
NSArray *arrayWithCopiedObjects = [originalArray deepCopy];

等等……

关于ios - 如何在 Objective-C 中复制自定义对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33295204/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap