从AFNetworking学习到的知识
NSString * AFPercentEscapedStringFromString(NSString *string)
在AFURLRequestSerialization.m文件里的方法,可以把url查询字符串中的一些特殊字符进行转换。具体实现可以去看源码,原来还有这种写法,涨姿势了!!!
rangeOfComposedCharacterSequencesForRange
NSString是UTF-16编码的, 也就是16位的unichar字符的序列. 所以, 一般遍历其每一个字符的方法就是:
for(int i = 0; i < str.length; i ++) {
unichar ch = [str characterAtIndex:i];
}
但不是所有字符都是用唯一一个16位的unichar字符来表示的,比如有些表情符号是用2个16位unichar字符来表示的,所以用上面的遍历方法显然不能满足我们的要求,不过系统提供了两个方法来解决这个问题:
分别是NSString的rangeOfComposedCharacterSequencesForRange:和rangeOfComposedCharacterSequenceAtIndex:两个方法;它们是用于遍历每个字符的,而不是遍历每个unichar的了,因此我们遍历字符串可以用下面的方法:
NSString *str =@"🐎";
NSRange range;
for(int i=0; i<str.length; i+=range.length){
range = [str rangeOfComposedCharacterSequenceAtIndex:i];
NSString *s= [str substringToIndex:range.location];
}
FOUNDATION_EXPORT
FOUNDATION_EXPORT: 对于extern的兼容性封装,根据不同的平台,转化为对应的extern形式。
NS_ASSUME_NONNULL_BEGIN 、NS_ASSUME_NONNULL_END
在swift存在option类型,也就是使用?和!声明变量。在OC里没有这个类型,但OC里也提供了相应的的关键词来描述:__nullable和__nonnull。
__nullable:表示对象可为null或者nil;
__nonnull:表示对象不能为null。
下面是实例:
- (id)itemWithName:(NSString * __nonnull)name;
在属性声明中,也增加了两个相应的特性,因此属性可以如下声明:
@property (nonatomic, copy, nonnull) NSArray * items;
当然也可以用以下这种方式:
@property (nonatomic, copy) NSArray * __nonnull items;
推荐使用nonnull这种方式,这样可以让属性声明看起来更清晰。
如果每个属性都需要设置nonnull或者nullable,是一件非常繁琐的事情,苹果提供了两个宏:NS_ASSUME_NONNULL_BEGIN和NS_ASSUME_NONNULL_END来减轻我们的工作量。在两个宏之间的代码,所有简单对象都被定义为nonnull,因此我们只需要设置nullable的指针即可。例如:
NS_ASSUME_NONNULL_BEGIN
@interface NullabilityClass ()
@property (nonatomic, copy) NSArray * items;
- (id)itemWithName:(nullable NSString *)name;
@end
NS_ASSUME_NONNULL_END
在上面的代码中,items属性默认是non null的,itemWithName:方法的返回值也是non null,而参数是指定为nullable的。
NS_ENUM_AVAILABLE_IOS
从单词的字面可以看出使用这个宏说明这个枚举开始IOS的版本:
IOS版本如下 7_0 代表7.0的版本.用_替换;参数只有一个NS_ENUM_AVAILABLE_IOS(3_0) 代表>=3.0开始