一些小知識點(2)

作者:Love@YR
鏈接:http://blog.csdn.net/jingqiu880905/article/details/51690345
請尊重原創,謝謝!

  1. 如何快速區別一個工程是其他工程的子工程還是單獨可以運行的項目?
    查看這個工程裏有沒有main.m,有的話即是單獨可以運行的項目。否則可能就是其他工程的依賴子工程,一般是會以靜態庫作爲最終的表現形式。

  2. 如何避免block的循環引用

//創建一個NSInvocationOperation
 NSInvocationOperation *invoOp6 = [[NSInvocationOperation alloc] initWithTarget:(id)self selector:@selector(handleInvoOp) object:nil];
    __weak typeof (NSInvocationOperation *)weak_invoOp6 = invoOp6;
    [invoOp6 setCompletionBlock:^{
        NSLog(@"invoOp6........OK !!");
        id result = [weak_invoOp6 result];
        NSLog(@"result is %@",result);
    }];

-(NSString *)handleInvoOp
{
      NSLog(@"InvoOp.....handle.....on thread num%@",[NSThread currentThread]);
     sleep(8);
    return @"第6個operation返回啦";
}

block裏面如果還用invoOp6就會報強引用invoOp6可能會引起循環引用的警告,而如果直接把invoOp6前面加上__weak關鍵字則會在還未等到回調就釋放了invoOp6。所以最終的解決方法如上。
其他更多關於block可參考:
http://blog.csdn.net/fengsh998/article/details/38090205
3. 如果沒有重寫NSOperation對象的start方法而直接start一個operation是會阻塞主線程的,如果是個耗時操作會明顯看到UI無響應。這期間對UI的動作例如button的click事件會被添加到此操作之後同步執行。
如何利用AFNetWorking創建一個同步的請求?

 AFHTTPRequestOperation *opt = [self.inner_httpRequestManager HTTPRequestOperationWithRequest:request success:nil failure:nil];

    [opt start];
    [opt waitUntilFinished];

異步的話就:

[self.inner_httpRequestManager.operationQueue  addOperation:opt];

此處的inner_httpRequestManager 是AFHTTPRequestOperationManager單例

waitUntilFinished的作用是阻塞當前運行的線程(必然不能是此operation運行的線程),直到此operation結束。
看AFNetworking2.x的源碼知道AFHTTPRequestOperation繼承自AFURLConnectionOperation,AFURLConnectionOperation的start方法裏說了

[self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];

走到後面發現

//創建了一個新的子線程
 dispatch_once(&oncePredicate, ^{
        _networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
        [_networkRequestThread start];
    });

//給這個線程取名爲AFNetworking
 [[NSThread currentThread] setName:@"AFNetworking"];

        NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
        [runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
        [runLoop run];

說明此opt不是在主線程的,所以不用擔心在didFinishLaunchingWithOptions裏測試時因爲創建operation時調了[opt waitUntilFinished]而阻塞主線程。
4. auto-layout約束裏的ratio:指寬高比
5. 通常在xcode里加入一個文件夾,直接將此文件夾拖入工程裏,選擇了copy items if need和create groups後,文件旁邊出現了?的標註,代表並未識別文件的修改狀態。此時點擊source control-add selected files,這樣文件就由?變成了A
6. 在Xcode中創建code snippet: 首先把格式代碼寫入文檔中,然後選中代碼拉入右方的code snippet 庫,編輯即可。
7. 到底Cocoa Touch是啥?
看維基百科:https://en.wikipedia.org/wiki/Cocoa_Touch
iOS, watchOS, and tvOS technologies can be seen as a set of layers, with Cocoa Touch at the highest level and the Core OS/kernel at the bottom.
A hierarchical view of the iOS, watchOS, and tvOS technologies can be shown as follows:

Cocoa Touch
Media / Application Services
Core Services
Core OS / iOS kernel
Main frameworks

Cocoa Touch provides the key frameworks for developing applications on devices running iOS. Some of these key frameworks are:

Foundation Kit Framework
UIKit Framework (based on Application Kit)
GameKit Framework
iAd Framework
MapKit Framework
Address Book UI Framework
EventKit UI Framework
Message UI Framework
Notification Center Framework
PushKit Framework
Twitter Framework

其他幾個層分別有什麼:
直觀圖:http://blog.csdn.net/GooHong/article/details/28911301

媒體層:http://blog.csdn.net/iukey/article/details/7666442
Core Services 層:http://blog.csdn.net/iukey/article/details/7666460
Core OS層:http://blog.csdn.net/iukey/article/details/7666469
Cocoa Touch 包含的框架都幹嘛的:http://blog.csdn.net/iukey/article/details/7666430
8. “?:”幹嘛的

 -(void)test{
 NSString * m=nil;
    [self logStr:m?:@"jeanhaha"];
//    m?:NSLog(@"m is %@",m);
    int i=10;
    i==11?:NSLog(@"i !=非10的值");
}
-(void)logStr:(NSString *)str
{
    NSLog(@"str is %@",str);
}

一般我們看到的都是(表達式)?操作1:操作2 那直接?:幹嘛的呢
其實就是把操作1省了, 即前面表達式如果爲NO則執行:後面的

上面那個 [self logStr:m?:@”jeanhaha”];代表的意思就是如果m爲空,把:後面的傳過去,否則把m當參數傳過去
9. id 和 instancetype什麼區別?
id不能指定類型而instancetype可以。
那麼以前的方法[[ClassName alloc]init]之後爲什麼就知道了類型呢?因爲編譯器對特定的幾種方法做了關聯類型返回,如alloc,init。但是像NSArray的array方法就沒有做關聯類型返回。當然現在Foudation裏絕大部分的id都已經換成了instancetype就不再存在這種問題。用了instancetype後返回的對象類型即爲調用的類的類型。
10. 有時會出現xcodeproj cannot be opened because the project file cannot be parsed的錯誤
是因爲proj文件有衝突。選中.xcodeproj,右鍵,show package contents。打開project.pbxproj,解決衝突,保存,即可。
11. OC語法糖:http://blog.csdn.net/u014165686/article/details/38545543

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章