pragma
- 用
#pragma mark -整理代码,划分区域。 忽略 clang 的警告。
1
2
3
4#pragma clang diagnostic push
#pragma clang diagnostic ignored “-Wunused-variable”
#pragma clang diagnostic pop
NULL / nil / NSNull
- C 语言中用
NULL表示空指针。 - Objective-C 中
nil是指向空的对象指针。 - 在框架层面,
NSNull是一个类,[NSNull null]返回一个NSNull的单例。 - 在
<Foundation/NSObjcRuntime.h>,Nil被定义为指向空的类指针。
在NSObjet刚被分配内存时,所有指向其他对象的指针都为nil。NSNull可以被存入 collection 类。NSNull是对NULL和nil的封装,以便可以在 collection 类中保存。
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类型。
相等性
NSObject 的isEqual:方法比较两个实例地址是否相同(本体性检查)。如果要对自定义的类进行相等性比较,要有以下三步:
- 实现
isEqualToClassName:方法,在该方法中对类中成员的值进行逐一比较。 - 子类重载
isEqual:方法,如果是本体则返回 true,如果不是本体则再进行isEqualToClassName:的值比较。 - 重载
hash方法。
C 存储类
auto: 自动变量。register: 寄存器变量,不宜使用。static: 静态变量,全局可见。extern: 外部变量,所有文件可见。
extern的用法:
全局字符串常量:
1
2
3
4
5.h
extern NSString * const kAppErrorDomain;
.m
NSString * const kAppErrorDomain = @"com.example.yourapp.error";公开全局可用的辅助方法。
@
@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
3float __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是一个上下文相关的关键字,当它作为返回类型,方法返回一个相关类型的结果。