Узнайте подклассы данного класса в Obj-C

Группа друзей и я работаю над приложением, которое живет в облаке. Однако часть облака, в котором это живет, находится под нашим контролем. Я никогда не доверял бы третьему лицу, чтобы сделать такой подъем для моего приложения, потому что я не управляю им. Недавнее отключение электричества Amazon S3 является превосходной иллюстрацией почему.

И я абсолютно, положительно, никогда не ставил бы части своей инфраструктуры (например), серверы Amazon. Серверами сборки, исходным кодом, и т.д., всегда плотно управляют. Не только из-за потенциальной ненадежности, но потому что я нахожу лицензии на эти сервисы чрезмерно разрешающими для поставщика услуг. Помимо этого, недобросовестный хост* мог потенциально взять мой исходный код и использовать его в их собственных целях, даже если бы что-то как этот не легализовано лицензионным соглашением, которое я должен был бы принять для использования сервиса.

*Probably не относится к Amazon, но я никогда не слышал о других двух, которые Вы упомянули, и пока они не вокруг в течение приблизительно десяти лет, я, вероятно, не доверял бы им или любым сервисам как они.

9
задан Johan Kool 28 November 2009 в 04:50
поделиться

5 ответов

Вместо того, чтобы пытаться автоматически зарегистрировать все подклассы MYCommand , почему бы не разделить проблему на две части?

Во-первых, предоставьте API для регистрации класса, например + [MYCommand registerClass:] .

Затем создайте код в MYCommand, который означает, что любые подклассы будут автоматически регистрироваться. Примерно так:

@implementation MYCommand
+ (void)load
{
    [MYCommand registerClass:self];
}
@end
13
ответ дан 4 December 2019 в 06:22
поделиться

Не напрямую, нет. Однако вы можете получить список всех классов, зарегистрированных во время выполнения, а также запросить эти классы для их прямого суперкласса. Имейте в виду, что это не позволяет вам найти всех предков для класса вверху дерева наследования, только непосредственный суперкласс.

Вы можете использовать objc_getClassList () , чтобы получить список Объекты класса , зарегистрированные во время выполнения. Затем вы можете перебрать этот массив и вызвать [NSObject superclass] для этих объектов Class , чтобы получить объект их суперкласса Class . Если по какой-то причине ваши классы не используют NSObject в качестве корневого класса, вы можете вместо этого использовать class_getSuperclass () .

Я также должен упомянуть, что вы могли неправильно думать о дизайне своего приложения, если чувствуете, что необходимо сделать такое открытие. Скорее всего, есть другой, более традиционный способ сделать то, что вы пытаетесь достичь, не предполагающий самоанализа в среде выполнения Objective-C.

19
ответ дан 4 December 2019 в 06:22
поделиться

Marc и bbum ударили по деньгам. Обычно это не очень хорошая идея.

Однако у нас есть код в нашей вики CocoaHeads, который делает это: http://cocoaheads.byu.edu/wiki/getting-all-subclasses

4
ответ дан 4 December 2019 в 06:22
поделиться

В моем проекте браузера среды выполнения здесь есть код, который включает метод -subclassNamesForClass :. См. Файлы RuntimeReporter. [Hm] .

0
ответ дан 4 December 2019 в 06:22
поделиться

Другой подход был просто опубликован Мэттом Галлахром его блог .

3
ответ дан 4 December 2019 в 06:22
поделиться