NSObjCRuntime.h
#if __LP64__ || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
这里定义了NSInteger和NSUInteger这两个数据类型,64位操作系统下是long型和unsigned long型。
原来NSInteger和NSUInteger是定义在这个类里面的,我特意创建了一个新的工程,写下NSInteger,查看了下Xcode文档,果然跳到了NSObjCRuntime.h这个类里面。
#define NSIntegerMax LONG_MAX
#define NSIntegerMin LONG_MIN
#define NSUIntegerMax ULONG_MAX
这里定义了三个宏,意思不言而喻。
#define NSINTEGER_DEFINED 1
这里应该是定义了一个单位1吧,小学数学里面学过,单位一。是一个NSInteger类型的数据,所以这里的宏起名称也是很到位。
#ifndef NS_DESIGNATED_INITIALIZER
#if __has_attribute(objc_designated_initializer)
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
#else
#define NS_DESIGNATED_INITIALIZER
#endif
#endif
了解了一下NS_DESIGNATED_INITIALIZER,苹果提供了这个宏的目的是指定初始化方法。除此外是禁用某方法的标志,这个挺常用的,NS_DESIGNATED_INITIALIZER可能用的比较少。
指定了初始化方法再用别的初始化方法会报警告。
NS_UNAVAILABLE 禁用某方法的标志
NS_DESIGNATED_INITIALIZER 指定初始化方法的标志
它们的使用如下:
- (instancetype)init NS_UNAVAILABLE;//禁止使用该方法
- (instancetype)initWithAge:(NSUInteger)age NS_DESIGNATED_INITIALIZER;//指定初始化方法
#ifndef
、#endif
条件编译,大致意思如下:
if (一个类指定了初始化方法) {
//如果该类支持指定的初始化方法
if (__has_attribute(objc_designated_initializer)) {
//重定义宏NS_DESIGNATED_INITIALIZER,使得该方法称为指定的初始化方法
#define NS_DESIGNATED_INITIALIZER __attribute__((objc_designated_initializer))
}
//如果一个类未指定初始化方法
else {
//定义了宏NS_DESIGNATED_INITIALIZER,但是未设置。其实默认是init方法作为初始化方法。
define NS_DESIGNATED_INITIALIZER
}
}
You can detect support for these attributes with __has_attribute().
关于__has_attribute(objc_designated_initializer)这些东西,可以再查资料学习,为节约时间,这里先不赘述了。