Определяемые пользователем атрибуты среды выполнения и связанные объекты

В настоящее время я пытаюсь использовать пользовательские атрибуты времени выполнения в Xcode 6 со следующим алгоритмом:

  1. Добавьте пользовательские свойства в класс UIView с помощью связанных объектов.

    #define ASSOCIATED_OBJECT_GETTER_AND_SETTER(propertyType, propertyName, propertyNameWithCapital, associationType)   \
    -(void)set##propertyNameWithCapital:(propertyType)_value                                                            \
    {                                                                                                                   \
        objc_setAssociatedObject(self, @selector(propertyName), _value, associationType);                               \
    }                                                                                                                   \
    -(propertyType)propertyName                                                                                         \
    {                                                                                                                   \
        return objc_getAssociatedObject(self, @selector(propertyName));                                                 \
    }                                                                                                                   \                                       
    
    @interface eMyTags : NSObject
    @property (nonatomic) NSString* name;
    @end
    
    @implementation eMyTags
    @synthesize name;
    @end
    
    @interface UIView (MyTags)
    @property (nonatomic) eMyTags* myTags;
    @property (nonatomic) NSString* myName;
    @end
    
    @implementation UIView (MyTags)
    @dynamic myTags, myName;
    ASSOCIATED_OBJECT_GETTER_AND_SETTER(eMyTags*, myTags, MyTags, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    ASSOCIATED_OBJECT_GETTER_AND_SETTER(NSString*, myName, MyName, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
    @end
    
  2. Установите значения этих свойств через раскадровку Xcode введите здесь описание изображения

  3. Доступ к этим свойствам в коде во время выполнения

    -(void)viewDidLoad
    {
        [super viewDidLoad];
        NSLog(@"myName: %@", view.myName);
        NSLog(@"myTags.name: %@", view.myTags.name);
    }
    

Когда я компилирую и запускаю вывод:

myName: bla
myTags.name: (null)

Так почему же myTags.name не задано? Что я пропустил? Могу ли я установить определяемые пользователем атрибуты времени выполнения пользовательских типов?


person Alexander    schedule 06.04.2015    source источник
comment
вам удалось найти решение для этого?   -  person Dani A    schedule 17.03.2017
comment
@DaniA Я нашел решение для своей конкретной проблемы, но я даже не помню, в чем была проблема и как я ее решил :) Это было 2 года назад, и я давно не писал код на Objective-C. с того времени. Мне жаль.   -  person Alexander    schedule 19.03.2017


Ответы (1)


Ну myTags не выделяется в памяти и не инициализируется. С другой стороны, значение @"bla" является строковым литералом, который на самом деле является экземпляром NSString и указывает на место в памяти.

person Burhanuddin Sunelwala    schedule 06.04.2015
comment
О, теперь понятно... Итак, когда я должен инициализировать myTags? Или невозможно использовать такие пользовательские типы? - person Alexander; 06.04.2015
comment
Атрибуты времени выполнения в xcode используются для установки значений для UIElements, которые, в свою очередь, выделяются и инициализируются при загрузке пера. spin.atomicobject.com/2014/05/30/xcode-runtime -атрибуты - person Burhanuddin Sunelwala; 06.04.2015
comment
При таком подходе загрузка и инициализация пользовательских объектов невозможна. Вам нужно написать код для этого :). - person Burhanuddin Sunelwala; 06.04.2015