Группа друзей и я работаю над приложением, которое живет в облаке. Однако часть облака, в котором это живет, находится под нашим контролем. Я никогда не доверял бы третьему лицу, чтобы сделать такой подъем для моего приложения, потому что я не управляю им. Недавнее отключение электричества Amazon S3 является превосходной иллюстрацией почему.
И я абсолютно, положительно, никогда не ставил бы части своей инфраструктуры (например), серверы Amazon. Серверами сборки, исходным кодом, и т.д., всегда плотно управляют. Не только из-за потенциальной ненадежности, но потому что я нахожу лицензии на эти сервисы чрезмерно разрешающими для поставщика услуг. Помимо этого, недобросовестный хост* мог потенциально взять мой исходный код и использовать его в их собственных целях, даже если бы что-то как этот не легализовано лицензионным соглашением, которое я должен был бы принять для использования сервиса.
*Probably не относится к Amazon, но я никогда не слышал о других двух, которые Вы упомянули, и пока они не вокруг в течение приблизительно десяти лет, я, вероятно, не доверял бы им или любым сервисам как они.
Вместо того, чтобы пытаться автоматически зарегистрировать все подклассы MYCommand
, почему бы не разделить проблему на две части?
Во-первых, предоставьте API для регистрации класса, например + [MYCommand registerClass:]
.
Затем создайте код в MYCommand, который означает, что любые подклассы будут автоматически регистрироваться. Примерно так:
@implementation MYCommand
+ (void)load
{
[MYCommand registerClass:self];
}
@end
Не напрямую, нет. Однако вы можете получить список всех классов, зарегистрированных во время выполнения, а также запросить эти классы для их прямого суперкласса. Имейте в виду, что это не позволяет вам найти всех предков для класса вверху дерева наследования, только непосредственный суперкласс.
Вы можете использовать objc_getClassList ()
, чтобы получить список Объекты класса
, зарегистрированные во время выполнения. Затем вы можете перебрать этот массив и вызвать [NSObject superclass]
для этих объектов Class
, чтобы получить объект их суперкласса Class
. Если по какой-то причине ваши классы не используют NSObject
в качестве корневого класса, вы можете вместо этого использовать class_getSuperclass ()
.
Я также должен упомянуть, что вы могли неправильно думать о дизайне своего приложения, если чувствуете, что необходимо сделать такое открытие. Скорее всего, есть другой, более традиционный способ сделать то, что вы пытаетесь достичь, не предполагающий самоанализа в среде выполнения Objective-C.
Marc и bbum ударили по деньгам. Обычно это не очень хорошая идея.
Однако у нас есть код в нашей вики CocoaHeads, который делает это: http://cocoaheads.byu.edu/wiki/getting-all-subclasses
В моем проекте браузера среды выполнения здесь есть код, который включает метод -subclassNamesForClass :. См. Файлы RuntimeReporter. [Hm]
.
Другой подход был просто опубликован Мэттом Галлахром его блог .