Можно ли создавать методы и переменные, устанавливать их во время выполнения в Objective-C?

Например:

@implementation MyClass{
    NSNumber *something;
}

Я хотел бы иметь возможность добавить несколько подобных во время выполнения к конкретному объекту (только один экземпляр), а не ко всему классу. В них уже есть указатели на другие объекты, и мне нужно, чтобы MyClass мог их использовать.

Вариант использования будет таким. Я нахожусь в другом экземпляре, назовите его A, и у меня есть некоторые переменные и метод, я хотел бы ввести переменные и метод в B, выполнить метод и отсоединить их, поэтому объект B нетронутый.

* В случае метода я бы предпочел не class_addMethod его, а предпочел бы просто отправить реализацию объекту A, чтобы он выполнил его на себе.


comment
Так что же изменилось после того, как вы их «отсоединили»? Метод редактировал некоторые из «исходных» переменных экземпляра?   -  person Wain    schedule 30.03.2014
comment
да. Собственные исходные переменные объекта А были изменены.   -  person unom    schedule 30.03.2014
comment
Нет, ты не можешь этого сделать. Вам нужно создать совершенно новый класс (который может быть просто подклассом MyClass с еще несколькими iVars), так как после того, как класс зарегистрирован во время выполнения, к нему не могут быть добавлены ivars. Однако методы могут быть добавлены к любому классу в любое время.   -  person Richard J. Ross III    schedule 30.03.2014
comment
Возможно, вы могли бы использовать связанные объекты? Они предоставляют аналогичную конструкцию для переменных экземпляра.   -  person Richard J. Ross III    schedule 30.03.2014
comment
Вполне возможно, что в Objective-C это возможно — есть ряд действительно странных функций, которые вы можете использовать для изменения класса или объекта во время выполнения, — но интерфейсы довольно загадочны и опасны, поэтому вам лучше посоветовать найти разная техника.   -  person Hot Licks    schedule 30.03.2014
comment
Я читал документацию, где есть class_addIvar и многие другие, но я искал способ дать мне контроль над каждым объектом. Я могу сделать что-то вроде class_addIvar, затем object_setIvar и class_addMethod, затем method_invoke... но как их удалить...   -  person unom    schedule 30.03.2014
comment
О некоторых методах, которые дают вам методы для каждого экземпляра, см. в разделе Создание делегатов на месте с помощью блоков. Однако Ричард прав насчет иваров.   -  person jscs    schedule 30.03.2014
comment
вставить .. отсоединить. Без разницы. Просто есть свойство x. Установите его, как вы хотите. Когда вы хотите .. установите его на ноль. x может быть большой структурой или большим классом с большим количеством информации.   -  person Fattie    schedule 30.03.2014
comment
Обратите внимание, что если вы (невероятно) действительно имеете дело с высокопроизводительными вычислениями и просто работаете с необработанной памятью, вы можете делать что-то вроде того, что вы описываете; но это немыслимо, что это имеет место здесь.   -  person Fattie    schedule 30.03.2014


Ответы (1)


Вы можете использовать ассоциированные объекты (см. objc_setAssociatedObject() и связанные с ними функции), но добавление переменных во время выполнения — довольно редкая практика. Что вы пытаетесь достичь?

person NSResponder    schedule 29.03.2014
comment
Например, у меня есть 10 совершенно разных классов объектов. Им нужно взаимодействовать по 5-6 за раз, и их соответствующие переменные меняются в соответствии с составом взаимодействия. Мне нужно, чтобы каждый объект знал обо всех остальных во время выполнения. Как можно использовать objc_getAssociatedObject(). Я только что прочитал, что вы можете подделать Иваров, если замаскируете их за фальшивыми геттерами и сеттерами. Теоретически можно хранить в каждом объекте ассоциацию со всеми остальными, мне по существу нужно хранить сам объект, роль, которую он играет в композиции, и список блоков, которые я могу выполнить на нем. - person unom; 30.03.2014
comment
Похоже, вам просто нужно войти в KVO, невероятно полезную часть всего опыта Cocoa. - person Fattie; 30.03.2014