yj.iOS 多標籤點贊評論評價功能

最近項目中有一個評價功能,但是遇到了一個問題, 創建不同的數組從數據源中取出標籤數據,再次存儲,發現數據修改後,源數據也有修改,查閱多方資料,是深淺拷貝的問題,雖然多次修改,存儲。new。init ,但是數組中存儲的數據仍然指向源數組所在內存地址 在此作出記錄

實現NSObject+Coding方法

NSObject+Coding

NSObject+Coding.h

/**

* 快速實現NSCoding協議中,編碼和解碼的方法

*/

@interface NSObject (Coding)

/**

* 通過Runtime解碼

*

* @param decoder NSCoder對象

*/

- (void)lxz_decodeWithCoder:(NSCoder *)decoder;

/**

* 通過Runtime編碼

*

* @param coder NSCoder對象

*/

- (void)lxz_encodeWithCoder:(NSCoder *)coder;

/**

* 通過Runtime實現自動copy

*

* @param zone NSZone對象

* @return 新對象

*/

- (id)lxz_copyWithZone:(NSZone *)zone;

NSObject+Coding.m

 

@implementation NSObject (Coding)

- (void)lxz_decodeWithCoder:(NSCoder *)decoder {

    unsigned int count = 0;

    Ivar *ivars = class_copyIvarList([self class], &count);

    if (ivars) {

        for (int i = 0; i < count; i++) {

            Ivar ivar = ivars[i];

            const char *ivarName = ivar_getName(ivar);

            NSString *keyName = [[NSString alloc] initWithUTF8String:ivarName];

            id value = [decoder decodeObjectForKey:keyName];

            [self setValue:value forKeyPath:keyName];

        }

    }

    free(ivars);

}

- (void)lxz_encodeWithCoder:(NSCoder *)coder {

    unsigned int count = 0;

    Ivar *ivars = class_copyIvarList([self class], &count);

    if (ivars) {

        for (int i = 0; i < count; i++) {

            Ivar ivar = ivars[i];

            const char *ivarName = ivar_getName(ivar);

            NSString *keyName = [[NSString alloc] initWithUTF8String:ivarName];

            id value = [self valueForKeyPath:keyName];

            [coder encodeObject:value forKey:keyName];

        }

    }

    free(ivars);

}

- (id)lxz_copyWithZone:(NSZone *)zone {

    NSObject *obj = [[[self class] allocWithZone:zone] init];

    unsigned int count = 0;

    Ivar *ivars = class_copyIvarList([self class], &count);

    if (ivars) {

        for (int i = 0; i < count; i++) {

            Ivar ivar = ivars[i];

            const char *ivarName = ivar_getName(ivar);

            NSString *keyName = [[NSString alloc] initWithUTF8String:ivarName];

            id value = [self valueForKeyPath:keyName];

 

            if ([value respondsToSelector:@selector(copyWithZone:)]) {

                [obj setValue:[value copy] forKey:keyName];

            } else {

                [obj setValue:value forKey:keyName];

            }

        }

    }

    free(ivars);

    return obj;

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章