zoukankan      html  css  js  c++  java
  • Objective-C基础知识

    内联函数

    “内联函数”是一个很老的概念,在其他语言譬如C++语言中也出现了。所谓“内联函数”指的是“有函数的结构,但不具备函数的性质,类似于宏替换功能的代码块”。

    在实际应用中,常常把规模较小、逻辑较简单的操作定义成内联函数,定义内联函数只要在函数前面加上inline关键字修饰即可;站在编译器的角度,处理内联函数就是在每个它的调用点上“内联地”展开。假设有定义如下函数:

    inline NSString * getNavigationTitleWithCount(int cnt) {
        return [NSString stringWithFormat:@"已选中%d项", (int)cnt];
    }

    则编译器对如下代码

    UILabel *label = [UILabel new];
    label.text = getNavigationTitleWithCount(0);

    的处理,如同对如下代码代码的处理:

    UILabel *label = [UILabel new];
    label.text = [NSString stringWithFormat:@"已选中%d项", (int)0];

    一句话说明,程序在“调用”内联函数时的开销和“调用”宏的开销是一样的,但内联函数显然比宏要强大一些,至少它保证了类型安全;相较于普通函数,“调用”内联函数没有“保护现场、push栈、pop栈等等”之类的开销。

    内联函数的好处显而易见,但并不是所有函数都可以形成真正的内联函数。如上所述,定义一个内联函数只要在定义时加上inline关键字即可,但能否形成真正的内联函数,还要看编译器对内联函数体内部的定义的具体处理。

    一般来说,内联函数定义的代码量逻辑简单、代码量小,并且属于那种频繁使用的代码块;内联函数不能使用循环语句,不能使用递归调用;

    const的使用

    在Objective-C代码中,经常需要定义一些常量指针,譬如AFNetworking中有如下代码:

    extern NSString * const AFNetworkingReachabilityDidChangeNotification;
    extern NSString * const AFNetworkingReachabilityNotificationStatusItem;

    和其他语言一样,定义常量的关键字是const,但问题是常常不知道const该往哪里放,是这样NSString * const XXOO,还是NSString const * XXOO

    其实,在Objective-C中还好一点,C/C++中const的各种使用姿势更难懂,如下:

    const char * label1 = "";
    char const * label2 = "";
    char * const label3 = "";
    const char * const label4 = "";

    经常傻傻分不清楚。不过还好,我的记忆还算可以,记得本科C语言老师教过一种简单的记忆方法“const总是修饰其左边的东东,如果其左边没有东东,则修饰右边的东东”,如何理解?对于char const * label2而言,const的左边是char,所以const修饰的是char本身,即内容本身,所以表示“label1指向的内容是常量,不可变”;对于const char * label1而言,const左边没有东东,所以它修饰右边的东东,即char,所以表示“label2指向的内容是常量,不可变”;对于char * const label3,const左边的东东是*,所以修饰的是指针,即表示“label3指针本身是常量,不可变”,所以解释如下:

    const char * label1 = ""; // 内容是常量,不可变
    char const * label2 = ""; // 内容是常量,不可变
    char * const label3 = ""; // 指针是常量,不可变
    const char * const label4 = ""; // 指针和内容都是常量,不可变

    这个判断方法同样适用于Objective-C,所以如下代码是没问题的:

    // const的左边是NSString,修饰的是NSString对象,表示“NSString对象本身不可修改”(但指针可以)
    static NSString const * testString = @"I am an iOS developer";
        
    - (void)viewDidLoad {
        [super viewDidLoad];
        testString = @"我是一个iOS开发者"; // 合法
        NSLog(@"%@", testString);   // print "我是一个iOS开发者"
    }

    但如下代码不合法:

    // const的左边是*,修饰的是指针本身,表示testString地址值不可修改
    static NSString * const testString = @"I am an iOS developer";
        
    - (void)viewDidLoad {
        [super viewDidLoad];
        testString = @"我是一个iOS开发者"; // 非法
        NSLog(@"%@", testString);
    }

    .mm文件

    • .m文件是Objective-C文件
    • .mm文件相当于C++或者C文件

    Extension和Category

    参考:http://blog.csdn.net/leikezhu1981/article/details/19091049

    Compiler Directives

    http://nshipster.com/at-compiler-directives/

    http://blog.sunnyxx.com/2014/04/13/objc_dig_interface/

    #pragma

    nil/Nil/NULL/NSNull

    http://nshipster.com/nil/

    isEqual:和==

    http://nshipster.com/equality/

  • 相关阅读:
    【BZOJ 4581】【Usaco2016 Open】Field Reduction
    【BZOJ 4582】【Usaco2016 Open】Diamond Collector
    【BZOJ 4580】【Usaco2016 Open】248
    【BZOJ 3754】Tree之最小方差树
    【51Nod 1501】【算法马拉松 19D】石头剪刀布威力加强版
    【51Nod 1622】【算法马拉松 19C】集合对
    【51Nod 1616】【算法马拉松 19B】最小集合
    【51Nod 1674】【算法马拉松 19A】区间的价值 V2
    【BZOJ 2541】【Vijos 1366】【CTSC 2000】冰原探险
    【BZOJ 1065】【Vijos 1826】【NOI 2008】奥运物流
  • 原文地址:https://www.cnblogs.com/FightingLuoYin/p/4519885.html
Copyright © 2011-2022 走看看