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
是一个上下文相关的关键字,当它作为返回类型,方法返回一个相关类型的结果。