Запустите NSRunLoop в командной строке программы Cocoa

Возможно ли инициализировать NSRunLoop без загрузки каких-либо файлов NIB (т. NSApplicationMain() Без вызова NSApplicationMain() )?

Благодарю.

Да; вы можете написать свой собственный основной метод и запустить NSRunLoop без возврата из NSApplicationMain .

Посмотрите на эту ссылку ; этот парень использует NSRunLoop в своем основном методе, но он не загружает файлы NIB, но он должен заставить вас идти с NSRunloops .

Решение заключается в вызове NSApplication вручную. Сначала создайте делегат приложения, чем замените вызов NSApplicationMain () в main.m следующим образом:

 AppDelegate * delegate = [[AppDelegate alloc] init]; NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSApplication * application = [NSApplication sharedApplication]; [application setDelegate:delegate]; [NSApp run]; [pool drain]; [delegate release]; 

Делегат будет вызываться, когда он готов, без необходимости использовать нить

 - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 

В Swift вы можете достичь этого, добавив следующую строку в конец вашего main.swift :

 NSRunLoop.currentRunLoop().run(); // Swift < 3.0 RunLoop.current.run(); // Swift >= 3.0 

Если вы хотите остановить цикл выполнения, вам нужно использовать методы Core Foundation.

 CFRunLoopRun(); // start 

И вы можете остановить это так

 CFRunLoopStop(CFRunLoopGetCurrent()); // stop 
 // Yes. Here is sample code (tested on OS X 10.8.4, command-line). // Using ARC: // $ cc -o timer timer.m -fobjc-arc -framework Foundation // $ ./timer // #include  @interface MyClass : NSObject @property NSTimer *timer; -(id)init; -(void)onTick:(NSTimer *)aTimer; @end @implementation MyClass -(id)init { id newInstance = [super init]; if (newInstance) { NSLog(@"Creating timer..."); _timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(onTick:) userInfo:nil repeats:YES]; } return newInstance; } -(void)onTick:(NSTimer *)aTimer { NSLog(@"Tick"); } @end int main() { @autoreleasepool { MyClass *obj = [[MyClass alloc] init]; [[NSRunLoop currentRunLoop] run]; } return 0; } 

Следуйте рекомендациям в документах для [NSRunLoop run]:

 BOOL shouldKeepRunning = YES; // global NSRunLoop *theRL = [NSRunLoop currentRunLoop]; while (shouldKeepRunning && [theRL runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]); 

Посмотрите на asynctask.m, который запускает NSRunLoop вручную, чтобы включить использование асинхронных уведомлений waitForDataInBackgroundAndNotify.

http://www.cocoadev.com/index.pl?NSPipe

  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; while(!terminated) { //if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]]) if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { break; } [pool release]; pool = [[NSAutoreleasePool alloc] init]; } [pool release]; в  NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init]; while(!terminated) { //if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]]) if (![[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) { break; } [pool release]; pool = [[NSAutoreleasePool alloc] init]; } [pool release]; 
  • Что именно делает делегат в проекте xcode ios?
  • Как распечатать имя метода и номер строки и условно отключить NSLog?
  • Получите данные Exif от UIImage - UIImagePickerController
  • Как включить и использовать новые шрифты в iPhone SDK?
  • Как отобразить изображение base64 в UIImageView?
  • Ширина пикселя текста в UILabel
  • UILongPressGestureRecognizer вызывается дважды при нажатии
  • View-based NSTableView с строками с динамическими высотами
  • как я могу использовать анимацию в cocos2d?
  • Полноэкранный UIView со строкой состояния и наложением панели навигации наверху
  • Есть ли способ указать позицию / индекс аргумента в NSString stringWithFormat?
  • Давайте будем гением компьютера.