杂记
基础
- 三目运算符
?:
NSString *test = @"test";
NSString *result = test?:@"fail";//result = @"test",当test为真时使用test值。
网络相关
User Agent
User Agent中文名为用户代理,简称 UA,它是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。
acceptableContentTypes
在网络response中会有“content type”在响应头中,如图:
responseHeader.png
content types用来标记网络响应的包的格式,此图中数据为JSON格式,可以按照这种格式进行数据解析。
在AFNetworking中默认的使用”AFJSONResponseSerializer“对responseSerializer进行初始化。
self.responseSerializer = [AFJSONResponseSerializer serializer];
所以,默认可响应的数据格式有3种“application/json", "text/json","text/javascript",如果想增加其他格式需要向acceptableContentTypes中添加即可。
+ (instancetype)OSCJsonManager
{
//AFN中所有的网络请求都是由manager进行管理操作的。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//向acceptableContentTypes中增加"text/html"格式的响应。
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
//设置UA
[manager.requestSerializer setValue:[self generateUserAgent] forHTTPHeaderField:@"User-Agent"];
return manager;
}
用户基本信息的存储使用的NSUserDefaults
NSUserDefaults 使用键值对将数据进行存储。
NSUserDefualts *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger:user.ID forKey:@"ID"]; //存储ID
[userDefaults setObject:user.name forKey:@"name"]; //存储name ,类型为NSString
user.ID = [userDefaults integerForKey:@"ID"]; //获取int型
user.name = [userDefaults objectForKey:@"name"]; //获取name ,类型为NSString
2016-11-17
坑1.网络数据刷新如何处理如上下拉刷新数据
填坑:上下拉请求更新数据
使用第三方的<MJExtension.h>和<MJRefresh.h>进行数据请求处理代码如下:
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//上拉数据请求
}];
self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
//下拉数据请求
}];
当页面第一次显示时在viewDidLoad
或viewWillAppear
中进行网络数据请求。
坑2.OSCObjsViewController中 refresh方法的调用
在此类的viewWillAppear中加入:NSLog(@"%@", [NSString stringWithUTF8String:object_getClassName(self)]);
查看一下继承此类时会不会自动调用此方法。
在tableViewController中,拖动cell滚动时会不是调用scrollViewDidScroll
方法?
会自动调用,无论是上拉还是下拉
通知
在视图viewWillAppear:中添加一个Observer,在视图退出时viewWillDisappear:移除观察者。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dawnAndNightMode:) name:@"dawnAndNight" object:nil];
}
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"dawnAndNight" object:nil];
}
泛型约束
__kindof
只允许本类或子类,相当于参数约束,如:
如说一个NSArray<UIView >,如果不加__kindof
,这个数组只能有UIView,即便是其子类也不行。而加了的话NSArray<__kindof UIView >,传入UIView的子类也是可以的,如UIImageView,UIButton等UIIView的子类都适用。
__typeof
在新的写法中已经将__typeof替换成了typeof()
- typeof()属于一元操作符。类似于sizeof()
- 可以根据typeof()括号里面的变量,自动识别变量类型并返回该类型。
typeof的使用
在iOS中的使用,常见运用于Block 。
下面看一个典型的用法:
__block typeof(self) bself = self;
[self methodBlock:^ {
[bself doSomething];
}
代码解释:定义一个和self相同数据类型的bself ,并赋值为self,在block中使用
神奇的宏
在YYKit定义了以下2个宏
@weakify(self) & @strongify
// @weakify(self)
#define weakify(object) autoreleasepool{} __weak __typeof__(object) weak##_##object = object;
//@strongify
#define strongify(object) autoreleasepool{} __typeof__(object) object = weak##_##object;
@weakify(self)展开后:__weak __typeof__(self) weak_self = self;
进一步的剖析__typeof__(self)
根据self的类型返所属类,进一步简化__weak CLASS weak_self = self;
这就容易理解多了,相当于定义了一个弱引用类型的self。
@strongify(self)最中展开后CLASS self = weak_self;
将self变成了弱引用类型了。
@strongify一定于@weakify成对儿使用,一般多用于block中如下代码:
@weakify(self)
[self doSomething^{
@strongify(self)
if (!self) return;
...
}];
方法
respondsToSelector
判断是否实现了某方法。
init
- 在对某个视图控制器进初始化时
[xxxViewController alloc] init]
方法时,会自动调用initWithNibName: bundle:
方法。
2016-12-20
tableView cell高度
默认cell高度是44, 定高cell建议使用self.tableView.rowHeight = 88;
,针对可变的cell高度可以在UITableViewDelegate中实现:
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // return xxx}
需要注意的是,实现了这个方法后,rowHeight
的设置将无效。所以,这个方法适用于具有多种 cell 高度的 UITableView。