1

次のカテゴリを見てください...私の知る限り、インスタンス変数をカテゴリに追加することはできません..

.h

//
// Created by macbook on 17.01.13.
//
// To change the template use AppCode | Preferences | File Templates.
//


#import <Foundation/Foundation.h>

@interface NSMutableArray (Cache)
@property (nonatomic, strong) NSArray *backup;

- (void)restoreBackup;
@end

.m

//
// 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

ここで何が起こっているのか、誰でも詳しく説明できますか..

バックアップを保存するこの方法は、この配列の個別のディープ コピーを作成するよりもメモリの消費量が少なくて済みますか?

4

1 に答える 1

0

objc_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];
}

上記は実際には機能しませんが、それを行う方法の概要です。

于 2013-03-26T12:06:00.023 に答える