Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 这段代码如何创建NSMutableArray的备份。。。?_Iphone_Ios_Objective C_Categories - Fatal编程技术网

Iphone 这段代码如何创建NSMutableArray的备份。。。?

Iphone 这段代码如何创建NSMutableArray的备份。。。?,iphone,ios,objective-c,categories,Iphone,Ios,Objective C,Categories,请看一下以下类别。。。据我所知,不能将实例变量添加到类别中 h m 有人能详细解释一下这里发生了什么事吗 这种存储备份的方法会占用更少的内存,而不是拥有此数组的单独深度副本吗?objc\u setAssociatedObject允许您将值与对象密钥对相关联。将其视为拥有一个与每个对象关联的隐式全局NSMutableDictionary。事实上,在将关联对象添加到运行时之前,词典的单例词典是完成相同任务的一种方法。下面是一个简化的示例,说明如何自己实现它,忽略类加载、线程安全以及如何正确使用对象作

请看一下以下类别。。。据我所知,不能将实例变量添加到类别中

h

m

有人能详细解释一下这里发生了什么事吗


这种存储备份的方法会占用更少的内存,而不是拥有此数组的单独深度副本吗?

objc\u setAssociatedObject允许您将值与对象密钥对相关联。将其视为拥有一个与每个对象关联的隐式全局NSMutableDictionary。事实上,在将关联对象添加到运行时之前,词典的单例词典是完成相同任务的一种方法。下面是一个简化的示例,说明如何自己实现它,忽略类加载、线程安全以及如何正确使用对象作为字典键等问题:

// Returns the global dictionary-of-dictionaries for associated objects
static NSMutableDictionary* getAssociationDict () {
    static dispatch_once_t once;
    static NSMutableDictionary* dict;
    dispatch_once(&once, ^{ dict = [[NSMutableDictionary alloc] init]; });
    return dict;
}

id my_objc_getAssociatedObject (id object, NSString* key) {
    return [[getAssociatedDict() objectForKey:object] objectForKey:key];
}

void my_objc_setAssociatedObject(id object, NSString* key, id value) {
    NSMutableDictionary* dict = getAssociationDict();
    NSMutableDictionary* objectDict = [dict objectForKey:object];
    // Create the per-object dictionary if it's missing
    if (! objectDict) {
        objectDict = [[NSMutableDictionary alloc] init];
        [dict setObject:objectDict forKey:object];
    }
    [objectDict setObject:value forKey:key];
}

尽管上述方法实际上不起作用,但它只是一个如何实现的概述。

而且这种存储备份的方法比使用此阵列的单独深度副本占用更少的内存吗…?这取决于作为备份存储的内容。您给出的代码示例实际上并没有创建备份,它只是提供了保存setBackup和恢复restoreBackup的方法。您仍然需要创建备份,是否使用深度拷贝或其他方法取决于您。
//
// Created by macbook on 17.01.13.
//
// To change the template use AppCode | Preferences | File Templates.
//
#import "NSMutableArray+Cache.h"
#import <objc/runtime.h>
#define CEBackupKey @"Backup"
@implementation NSMutableArray (Cache)
#pragma mark - Properties
- (NSArray *)backup {
    return objc_getAssociatedObject(self, CEBackupKey);
}
- (void)setBackup:(NSArray *)backup {
    objc_setAssociatedObject(self, CEBackupKey, backup, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
#pragma mark - Methods
- (void)restoreBackup {
    [self removeAllObjects];
    [self addObjectsFromArray:self.backup];
}
@end
// Returns the global dictionary-of-dictionaries for associated objects
static NSMutableDictionary* getAssociationDict () {
    static dispatch_once_t once;
    static NSMutableDictionary* dict;
    dispatch_once(&once, ^{ dict = [[NSMutableDictionary alloc] init]; });
    return dict;
}

id my_objc_getAssociatedObject (id object, NSString* key) {
    return [[getAssociatedDict() objectForKey:object] objectForKey:key];
}

void my_objc_setAssociatedObject(id object, NSString* key, id value) {
    NSMutableDictionary* dict = getAssociationDict();
    NSMutableDictionary* objectDict = [dict objectForKey:object];
    // Create the per-object dictionary if it's missing
    if (! objectDict) {
        objectDict = [[NSMutableDictionary alloc] init];
        [dict setObject:objectDict forKey:object];
    }
    [objectDict setObject:value forKey:key];
}