心辰·Dev

NSHipster 博客干货整理 | OC 基础

pragma

  1. #pragma mark -整理代码,划分区域。
  2. 忽略 clang 的警告。

    1
    2
    3
    4
    #pragma clang diagnostic push
    #pragma clang diagnostic ignored “-Wunused-variable”

    #pragma clang diagnostic pop

NULL / nil / NSNull

  1. C 语言中用NULL表示空指针。
  2. Objective-C 中nil是指向空的对象指针。
  3. 在框架层面,NSNull是一个类,[NSNull null] 返回一个NSNull的单例。
  4. <Foundation/NSObjcRuntime.h>, Nil被定义为指向空的类指针。

NSObjet刚被分配内存时,所有指向其他对象的指针都为nil
NSNull可以被存入 collection 类。NSNull是对NULLnil的封装,以便可以在 collection 类中保存。
NULL / nil / NSNull

BOOL / bool / Boolean / NSNumber

32-bit iOS 系统中,BOOL是一个 signed char 的typedef,用YES/NO的宏代表 true or false.
64-bit iOS 系统中,BOOL是一个bool
以下代码:

1
NSLog(@“%@”, [@(YES) class]);

会输出:
__NSCFBoolean

NSCFBoolean是在NSNumber类簇中一个私有类。桥接CFBooleanRef类型。
BOOL / bool / Boolean / NSNumber

相等性

NSObject 的isEqual:方法比较两个实例地址是否相同(本体性检查)。如果要对自定义的类进行相等性比较,要有以下三步:

  1. 实现isEqualToClassName:方法,在该方法中对类中成员的值进行逐一比较。
  2. 子类重载isEqual:方法,如果是本体则返回 true,如果不是本体则再进行isEqualToClassName:的值比较。
  3. 重载hash方法。

C 存储类

  • auto: 自动变量。
  • register: 寄存器变量,不宜使用。
  • static: 静态变量,全局可见。
  • extern: 外部变量,所有文件可见。

extern的用法:

  1. 全局字符串常量:

    1
    2
    3
    4
    5
    .h
    extern NSString * const kAppErrorDomain;

    .m
    NSString * const kAppErrorDomain = @"com.example.yourapp.error";
  2. 公开全局可用的辅助方法。

@

@autoreleasepool{}: 优化循环中大量临时对象的内存释放。
@compatibility_alias: 提高向后兼容性。

_attribute_

GCC 用法

  • 格式:

    1
    extern int my_printf(void *my_object, const char *my_format, …) __attribute__((format(printf, 2, 3)));
  • 非空:

    1
    extern void *my_memcpy(void *dest, const void *src, size_t len) __attribute__((non null (1, 2)));
  • noreturn:

    1
    extern void die(const char *format, …) __attribute__((noreturn, format(printf, 1, 2)));
  • pure / const: 除了返回值没有其他效果。 返回值只依赖于参数和全局变量。const指明不检查除参数外的任何值,除返回值以外没有副作用。

    1
    int square(int n) __attribute__((const));
  • unused: 消除 unused 警告。

LLVM 用法

  • 可用性,支持平台有 iOS / macosx 等:

    1
    void f(void) __attribute__((availability(macosx, introduced = 10.4, deprecated = 10.6, obsoleted = 10.7)));
  • 重载:

    1
    2
    3
    float __attribute__((overloadable)) tgsin(float x) {return sinf(x);}
    double __attribute__((overloadable)) tgsin(double x) {return sin(x);}
    long double __attribute__((overloadable)) tgsin(long double x) {return sinl(x);}

instancetype

由于 Objective-C 自身的方法命名规范,instancetype是一个上下文相关的关键字,当它作为返回类型,方法返回一个相关类型的结果。