美文网首页
Objective-C进化特性

Objective-C进化特性

作者: 秋刀生鱼片 | 来源:发表于2016-06-17 09:32 被阅读67次

    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];
    
    ...
    

    在例如:

     @autoreleasepool {
        //括号里面分配内存的对象,都会加入大括号包裹的自动释放持,在大括号结束时释放。
     }
    

    当然,任何ObjC的方法,每一对大括号都是自带自动释放池的,不是特殊需要不用特别地使用@autoreleasepool

    Literals 字面量特性

    这个的翻译一直很难确定,可以认为是一种简写。

    不使用Literals特性时我们这样写:

    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特性,就可以简写了:

    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];
            });
        });
    }
    

    相关文章

      网友评论

          本文标题:Objective-C进化特性

          本文链接:https://www.haomeiwen.com/subject/rjcvdttx.html