Ассоциация объектов используя функции runtime

В умелых руках функции <obj/runtime.h> может быть мощным инструментом.

Для того чтобы расширить объект с дополнительными данными можно  используя механизм associated object.

Как можно понять  из названия происходит связывание объекта с другим объектом используя уникальный ключ.

Вы можете получить и установить эти связанные объекты используя следующие функции:

// Get a value associated with the object by key
id objc_getAssociatedObject(id object, const void *key)
 
// Associate a value with the object by key
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

object — обект, который в настоящее время расширяется.
value — объект, который привязывается к расширяемому объекту.
key — уникальное идентификационное значение, которое должно оставаться постоянным в течении всей жизни процесса.
object_Association_Policy — константа, которая определяет как объект будет сохранен. Это работает наподобие модификаторов
atomic/nonamatic и retain/copy/assign которые вы используете при объявлении свойств.

Для примера, создадим категорию которая будет расширять UIView:
.h файл

#import <UIKit/UIKit.h>

@interface UIView (UIView_Cookie)

@property(strong) id cookie;

@end

.m файл

#import "UIView+Cookie.h"
#import <objc/runtime.h>

static char ViewCookieKey;

@implementation UIView (UIView_Cookie)

- (id)cookie {
   returnobjc_getAssociatedObject(self, &BAViewCookieKey);
}

- (void)setCookie:cookie {
   objc_setAssociatedObject(self, &BAViewCookieKey, cookie, OBJC_ASSOCIATION_RETAIN);
}
@end

И для нового языка swift эта конструкция будет выглядеть следующем образом.
В swift нет категорий, но там есть аналог extensions.

import UIkit
import ObjectiveC

// Declare a global var to produce a unique address as the assoc object handle
var ViewCookieKey: UInt8 = 0

extension UIView {
    var cookie:AnyObject {
        get {
            return objc_getAssociatedObject(self, &ViewCookieKey) as AnyObject
        }
        set {
            objc_setAssociatedObject(self, &ViewCookieKey, newValue, objc_AssociationPolicy(OBJC_ASSOCIATION_RETAIN_NONATOMIC))
        }
    }
}
Вы можете оставить комментарий, или ссылку на Ваш сайт.

Оставить комментарий