iOS-приложение, классы внезапно исчезают, происходит сбой в alloc - PullRequest
0 голосов
/ 05 августа 2010

Это странно. Время от времени, когда я работал над своим приложением, эта проблема всплывала, а затем всегда таинственно исчезала. Сегодня он отказывается исчезнуть.

Мое приложение использует два контроллера вида для обработки автоматического поворота. Иногда Objective-C не может найти мои занятия. Например, [OneViewController alloc] будет аварийно завершать работу. Я добавил функцию, чтобы перехватить это состояние, и даже если я вызову его до того, как выполню одну строку моего собственного кода, все равно не работает. Я беру это, чтобы доказать, что что-то не так, это не с каким-то плохим кодом, который я, возможно, написал.

У кого-нибудь есть идеи, почему universalGoodness не будет константой?

void verifyUniversalGoodness()
{
 id portrait_class, landscape_class;

 portrait_class = NSClassFromString(@"OneViewController");
 landscape_class = NSClassFromString(@"OtherViewController");
 NSLog(@"CHECKING GOODNESS: portrait %@, landscape %@", portrait_class, landscape_class);
 if (portrait_class == nil || landscape_class == nil)
  exit(0);
}

int main( int argc, char *argv[] )
{
    verifyUniversalGoodness();

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;

}

Вот как выглядит трассировка стека, если я позволю ей запускаться до вызова alloc ...

#1  0x3356296c in _class_initialize ()
#2  0x33567dfe in prepareForMethodLookup ()
#3  0x33565168 in lookUpMethod ()
#4  0x33562914 in _class_lookupMethodAndLoadCache ()
#5  0x3356264a in objc_msgSend_uncached ()
#6  0x000de704 in -[MyAppDelegate finishStartup] (self=0x61c9a0, _cmd=0x303117) at /Users/michael.toy/PROJECT/MyAppDelegate.mm:180
#7  0x32b77904 in __NSFireDelayedPerform ()
#8  0x32c23d22 in CFRunLoopRunSpecific ()
#9  0x32c234e0 in CFRunLoopRunInMode ()
#10 0x30d620da in GSEventRunModal ()
#11 0x30d62186 in GSEventRun ()
#12 0x314d54c8 in -[UIApplication _run] ()
#13 0x314d39f2 in UIApplicationMain ()
#14 0x000e13a8 in main (argc=1, argv=0x2ffff5a8) at /Users/michael.toy/PROJECT/main.mm:38

Ответы [ 3 ]

1 голос
/ 05 августа 2010

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

0 голосов
/ 05 августа 2010

portrait_class/landscape_class должен быть Class объектом, а не id объектом:

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

(это из objc.h)

0 голосов
/ 05 августа 2010

Я не знаю ответа, но меня поразили разные формулировки NSClassFromString () и NSBundle -(Class)classNamed:(NSString *)className

"Объект класса, названный aClassName, или ноль, если нет классапо этому имени в настоящее время загружается *. Если aClassName равно nil, возвращает nil. "

vs

" Объект Class для className. Возвращает nil, если className не одноклассов, связанных с получателем, или если при загрузке исполняемого кода, содержащего реализацию класса, произошла ошибка. "

Так что NSClassFromString (), по-видимому, не подразумевает порядок фактической загрузки класса.

...