Objective-C進化特性

Objective-C進化特性

[TOC]編程

毫無疑問,Objective-C (下稱ObjC)在誕生三十年後,由於iOS系統在移動設備領域的制霸,迎來了近五年來一年一波的進化,這些新特性代表ObjC這個年事已高的語言,仍在一步一步追逐現代編程語言的步伐。安全

Modern Objective-C 現代Objective-C語言

Automatic Reference Counting

自動引用計數技術,簡稱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 字面量特性

這個的翻譯一直很難肯定,能夠認爲是一種簡寫。函數

不使用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

一樣舉例比對,首先是不使用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;

一目瞭然,更接近現代編程語言的風格。

技術革新

block 閉包

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
*/

Grand Central Dispatch

簡稱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];
        });
    });
}
相關文章
相關標籤/搜索