NSOperationでマルチスレッド処理を構築する場合、
NSOperationのサブクラスを作成しその中のmainで処理を実装することになる。
作成したoperationをNSOperationQueueにaddOperationして実行する。

もう少し簡単に実装する場合NSBlockOperationやNSInvocationOperationが使える。
名前の通りNSBlockOperationは処理の内容をblockで記述しoperationとして登録する。
NSInvocationOperationは@selectorで処理対象メソッドを指定しoperationに登録する。

以下、サンプルコード

#import <Foundation/Foundation.h>

@interface InvocationTest : NSObject
-(void)test;
@end

@implementation InvocationTest

-(void)test
{
    sleep(1);
    NSLog(@"invocation\n");
}

@end

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

    @autoreleasepool {
        
        NSLog(@"start\n");
        
        NSOperationQueue *queue = [[NSOperationQueue alloc]init];
        
        NSOperation *op1 = 
            [NSBlockOperation blockOperationWithBlock:^{
            [NSThread sleepForTimeInterval:2.0];
            NSLog(@"block\n");
        }];
        
        [queue addOperation:op1];   // blockオペレーション追加
        
        InvocationTest *test = [[InvocationTest alloc]init];
        
        NSOperation *op2 = 
            [[NSInvocationOperation alloc]initWithTarget:test
                                                selector:@selector(test)
                                                  object:nil];
        
        [queue addOperation:op2];   // invocationオペレーション追加
        
        NSLog(@"end\n");
        
        [queue waitUntilAllOperationsAreFinished];
        
    }
    return 0;
}