NSObjCRuntime.h

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
	}
}

关于__has_attribute()

You can detect support for these attributes with __has_attribute().

关于__has_attribute(objc_designated_initializer)这些东西,可以再查资料学习,为节约时间,这里先不赘述了。

参考学习网址:Clang documentation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Morris_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值