基礎(chǔ)
- 三目運算符
?:
NSString *test = @"test";
NSString *result = test?:@"fail";//result = @"test",當test為真時使用test值。
網(wǎng)絡(luò)相關(guān)
User Agent
User Agent中文名為用戶代理,簡稱 UA,它是一個特殊字符串頭,使得服務(wù)器能夠識別客戶使用的操作系統(tǒng)及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
acceptableContentTypes
在網(wǎng)絡(luò)response中會有“content type”在響應(yīng)頭中,如圖:

content types用來標記網(wǎng)絡(luò)響應(yīng)的包的格式,此圖中數(shù)據(jù)為JSON格式,可以按照這種格式進行數(shù)據(jù)解析。
在AFNetworking中默認的使用”AFJSONResponseSerializer“對responseSerializer進行初始化。
self.responseSerializer = [AFJSONResponseSerializer serializer];
所以,默認可響應(yīng)的數(shù)據(jù)格式有3種“application/json", "text/json","text/javascript",如果想增加其他格式需要向acceptableContentTypes中添加即可。
+ (instancetype)OSCJsonManager
{
//AFN中所有的網(wǎng)絡(luò)請求都是由manager進行管理操作的。
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
//向acceptableContentTypes中增加"text/html"格式的響應(yīng)。
manager.responseSerializer.acceptableContentTypes = [manager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];
//設(shè)置UA
[manager.requestSerializer setValue:[self generateUserAgent] forHTTPHeaderField:@"User-Agent"];
return manager;
}
用戶基本信息的存儲使用的NSUserDefaults
NSUserDefaults 使用鍵值對將數(shù)據(jù)進行存儲。
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.網(wǎng)絡(luò)數(shù)據(jù)刷新如何處理如上下拉刷新數(shù)據(jù)
填坑:上下拉請求更新數(shù)據(jù)
使用第三方的<MJExtension.h>和<MJRefresh.h>進行數(shù)據(jù)請求處理代碼如下:
self.tableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//上拉數(shù)據(jù)請求
}];
self.tableView.mj_footer = [MJRefreshBackNormalFooter footerWithRefreshingBlock:^{
//下拉數(shù)據(jù)請求
}];
當頁面第一次顯示時在viewDidLoad或viewWillAppear中進行網(wǎng)絡(luò)數(shù)據(jù)請求。
坑2.OSCObjsViewController中 refresh方法的調(diào)用
在此類的viewWillAppear中加入:NSLog(@"%@", [NSString stringWithUTF8String:object_getClassName(self)]); 查看一下繼承此類時會不會自動調(diào)用此方法。
在tableViewController中,拖動cell滾動時會不是調(diào)用scrollViewDidScroll方法?
會自動調(diào)用,無論是上拉還是下拉
通知
在視圖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
只允許本類或子類,相當于參數(shù)約束,如:
如說一個NSArray<UIView >,如果不加__kindof
,這個數(shù)組只能有UIView,即便是其子類也不行。而加了的話NSArray<__kindof UIView >,傳入UIView的子類也是可以的,如UIImageView,UIButton等UIIView的子類都適用。
__typeof
在新的寫法中已經(jīng)將__typeof替換成了typeof()
- typeof()屬于一元操作符。類似于sizeof()
- 可以根據(jù)typeof()括號里面的變量,自動識別變量類型并返回該類型。
typeof的使用
在iOS中的使用,常見運用于Block 。
下面看一個典型的用法:
__block typeof(self) bself = self;
[self methodBlock:^ {
[bself doSomething];
}
代碼解釋:定義一個和self相同數(shù)據(jù)類型的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)根據(jù)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
判斷是否實現(xiàn)了某方法。
init
- 在對某個視圖控制器進初始化時
[xxxViewController alloc] init]方法時,會自動調(diào)用initWithNibName: bundle:方法。
2016-12-20
tableView cell高度
默認cell高度是44, 定高cell建議使用self.tableView.rowHeight = 88;,針對可變的cell高度可以在UITableViewDelegate中實現(xiàn):
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { // return xxx}
需要注意的是,實現(xiàn)了這個方法后,rowHeight
的設(shè)置將無效。所以,這個方法適用于具有多種 cell 高度的 UITableView。