[TOC]編程
毫無疑問,Objective-C (下稱ObjC)在誕生三十年後,由於iOS系統在移動設備領域的制霸,迎來了近五年來一年一波的進化,這些新特性代表ObjC這個年事已高的語言,仍在一步一步追逐現代編程語言的步伐。安全
自動引用計數技術,簡稱ARC
,是Objective-C的一項重要進化。編譯器在編譯過程當中,自動分析代碼,爲對象添加release、retain、dealloc調用,大大減小開發中的內存管理代碼,減小了工程師將近三分之一的工做負擔,而且更加安全穩定。多線程
現在的Xcode工程,都自動開啓了ARC模式,在這種模式下,工程師不能夠手動調用release、retain、dealloc、autoreloease等函數,但工程師仍是能夠靈活處理。閉包
例如:異步
@property (nonatomic, strong) NSArray* datas; ... //某處 self.datas = nil; //編譯器會自動在這據句調用前執行 [self.datas release]; ...
在例如:async
@autoreleasepool { //括號裏面分配內存的對象,都會加入大括號包裹的自動釋放持,在大括號結束時釋放。 }
固然,任何ObjC的方法,每一對大括號都是自帶自動釋放池的,不是特殊須要不用特別地使用@autoreleasepool
。編程語言
這個的翻譯一直很難肯定,能夠認爲是一種簡寫。函數
不使用Literals特性時咱們這樣寫:atom
NSArray *myArray = [NSArray arrayWithObjects:object1,object2,object3,nil]; NSDictionary *myDictionary1 = [NSDictionary dictionaryWithObject:someObject forKey:@"key"]; NSDictionary *myDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:object1, key1, object2, key2, nil]; NSNumber *myNumber = [NSNumber numberWithInt:myInt]; NSNumber *mySumNumber= [NSNumber numberWithInt:(2 + 3)]; NSNumber *myBoolNumber = [NSNumber numberWithBool:YES];
使用Literals特性,就能夠簡寫了:spa
NSArray *myArray = @[ object1, object2, object3 ]; NSDictionary *myDictionary1 = @{ @"key" : someObject }; NSDictionary *myDictionary2 = @{ key1: object1, key2: object2 }; NSNumber *myNumber = @(myInt); NSNumber *mySumNumber = @(2+3); NSNumber *myBoolNumber = @YES; NSNumber *myIntegerNumber = @8;
讓基本數據對象,操做起來更便捷,就是一大進步。
一樣舉例比對,首先是不使用Subscripting特性
id object1 = [someArray objectAtIndex:0]; id object2 = [someDictionary objectForKey:@"key"]; [someMutableArray replaceObjectAtIndex:0 withObject:object3]; [someMutableDictionary setObject:object4 forKey:@"key"];
而後是用了Subscripting特性
id object1 = someArray[0]; id object2 = someDictionary[@"key"]; someMutableArray[0] = object3; someMutableDictionary[@"key"] = object4;
一目瞭然,更接近現代編程語言的風格。
iOS4
引入的block特性,看看下面的例子,關於閉包的詳細咱們將單獨寫一篇文章進行講解。
#include <stdio.h> #include <Block.h> typedef int (^IntBlock)(); IntBlock MakeCounter(int start, int increment) { __block int i = start; return Block_copy( ^ { int ret = i; i += increment; return ret; }); } int main(void) { IntBlock mycounter = MakeCounter(5, 2); printf("First call: %d\n", mycounter()); printf("Second call: %d\n", mycounter()); printf("Third call: %d\n", mycounter()); /* because it was copied, it must also be released */ Block_release(mycounter); return 0; } /* Output: First call: 5 Second call: 7 Third call: 9 */
簡稱GCD技術,是Apple開發的用於簡化開發多核多線程
編程提供的一套底層C接口,詳細內容將在單獨的章節進行講解。
//單線程阻塞
- (IBAction)analyzeDocument:(NSButton *)sender { NSDictionary *stats = [myDoc analyze]; [myModel setDict:stats]; [myStatsView setNeedsDisplay:YES]; }
//多線程異步等待,數據加載完畢後,主線程渲染。
- (IBAction)analyzeDocument:(NSButton *)sender { dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ NSDictionary *stats = [myDoc analyze]; dispatch_async(dispatch_get_main_queue(), ^{ [myModel setDict:stats]; [myStatsView setNeedsDisplay:YES]; }); }); }