从AFNetworking学习到的知识

2018-10-08  本文已影响0人  shiyueZ

在AFURLRequestSerialization.m文件里的方法,可以把url查询字符串中的一些特殊字符进行转换。具体实现可以去看源码,原来还有这种写法,涨姿势了!!!

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: 对于extern的兼容性封装,根据不同的平台,转化为对应的extern形式。

在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的。

从单词的字面可以看出使用这个宏说明这个枚举开始IOS的版本:
IOS版本如下 7_0 代表7.0的版本.用_替换;参数只有一个NS_ENUM_AVAILABLE_IOS(3_0) 代表>=3.0开始

上一篇下一篇

猜你喜欢

热点阅读