1精算、監(jiān)聽導(dǎo)航欄的frame 和 屏幕旋轉(zhuǎn)起沖突,會崩潰
// 監(jiān)聽導(dǎo)航欄的frame
[self.navigationController.navigationBar addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context{
NSNumber *num = change[@"new"];
NSLog(@"-----------------------------num = %@",num);
CGRect rect = num.CGRectValue;
self.navBar.frame = rect;
}
- (void)dealloc{
[self.navigationController.navigationBar removeObserver:self forKeyPath:@"frame"];
}
/**
* @author 孔凡列, 16-09-21 08:09:06
*
* 橫屏
*/
NSNumber *value = [NSNumber numberWithInt:UIInterfaceOrientationLandscapeRight];
[[UIDevice currentDevice] setValue:value forKey:@"orientation"];
2斥季、appDelegate 里面創(chuàng)建UIWindow的時候欺嗤,需要指定window的frame参萄,不然iOS8 的window的寬高會為0,但是iOS8以上就不會出現(xiàn)問題
self.window = [[UIWindow alloc] init];// 這樣不行
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0,0,SCREEN_WIDTH,SCREEN_HEIGHT)];// 這樣就不會出現(xiàn)適配問題
3煎饼、AVAudioPlayer播放聲音的時候讹挎,設(shè)置volume 為 1.0 后還是超級小聲,超過1.0就會失真.添加一句代碼可完美解決
[[AVAudioSession sharedInstance] overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker error:nil];
4吆玖、監(jiān)聽橫豎屏旋轉(zhuǎn)筒溃,系統(tǒng)通知
UIDeviceOrientationDidChangeNotification
5、swift NSObject 的方法都不適用了衰伯,很多都是struct 不是 class
String 是struct 屬于 Any 不是 AnyObject铡羡,所以iskind 不能用,用is 判斷
6意鲸、iOS KVO監(jiān)聽數(shù)組元素個數(shù)變化(數(shù)組地址改變烦周、插入、刪除怎顾、替換)
- 需要 用
mutableArrayValueForKey
獲取到的可變數(shù)組(網(wǎng)上說控制器的數(shù)組沒辦法監(jiān)聽读慎,其實(shí)可以的,只是一定要用mutableArrayValueForKey
) - 還有一個注意點(diǎn):分類中的數(shù)組是沒辦法監(jiān)聽到的槐雾,其他都可以
7夭委、iOS 系統(tǒng)字體
[UIFont systemFontSize];// 系統(tǒng)默認(rèn)字體大小 14
[UIFont smallSystemFontSize];// 小系統(tǒng)字體大小 12
[UIFont labelFontSize]募强;// 系統(tǒng)label字體大小 17
[UIFont buttonFontSize]株灸;// 系統(tǒng)button字體大小 18
8、typeof(self) strongSelf = weakSelf; 的使用解答地址
總結(jié)
1擎值、 在 Block 內(nèi)如果需要訪問 self 的方法慌烧、變量,建議使用 weakSelf鸠儿。
2 屹蚊、如果在 Block 內(nèi)需要多次 訪問 self,則需要使用 strongSelf进每。此時self不會被釋放汹粤,當(dāng)block執(zhí)行完后,會自動釋放該strongSelf
9田晚、layoutSubviews 什么時候調(diào)用嘱兼?drawRect 什么時候調(diào)用?
視圖的內(nèi)容需要重繪時可以調(diào)用
setNeedsDisplay
方法贤徒,該方法會設(shè)置該視圖的displayIfNeeded
變量為 YES 芹壕,NSRunLoop 在下一次循環(huán)檢中測到該值為 YES 則會自動調(diào)用drawRect
進(jìn)行重繪胃惜。視圖的內(nèi)容沒有變化,但在父視圖中位置變化了可以調(diào)用
setNeedsLayout
,該方法會設(shè)置該視圖的layoutIfNeeded
變量為YES哪雕,NSRunLoop 在下一次循環(huán)檢中測到該值為 YES 則會自動調(diào)用layoutSubViews
進(jìn)行重繪。
10鲫趁、AFN3.0 支持ipv6斯嚎,代碼配置
11、取狀態(tài)欄判斷網(wǎng)絡(luò)狀態(tài)
注意:飛行模式和關(guān)閉移動網(wǎng)絡(luò)都拿不到dataNetworkType挨厚;1 - 2G; 2 - 3G; 3 - 4G; 5 - WIFI
BOOL flag = NO;
UIApplication *app = [UIApplication sharedApplication];
NSArray *children = [[[app valueForKeyPath:@"statusBar"] valueForKeyPath:@"foregroundView"] subviews];
int netType = 0;
//獲取到網(wǎng)絡(luò)返回碼
for (id child in children) {
NSLog(@"child = %@",NSStringFromClass([child class]));
if ([child isKindOfClass:NSClassFromString(@"UIStatusBarDataNetworkItemView")]) {
//獲取到狀態(tài)欄,飛行模式和關(guān)閉移動網(wǎng)絡(luò)都拿不到dataNetworkType堡僻;1 - 2G; 2 - 3G; 3 - 4G; 5 - WIFI
netType = [[child valueForKeyPath:@"dataNetworkType"] intValue];
switch (netType) {
case 0:
flag = NO;
//無網(wǎng)模式
break;
default:
flag = YES;
break;
}
}
}
12、label 文字實(shí)現(xiàn)豎直排布
- 只需要設(shè)置
numberOfLines = 0
然后再調(diào)用sizeToFit
13疫剃、本地搭建IPv6環(huán)境測試你的APP(OS X 10.11 新加的功能)
打開系統(tǒng)偏好設(shè)置-按住
option
- 點(diǎn)擊共享-創(chuàng)建NAT64
14钉疫、給 按鈕 的imageView添加動畫組
注意不能設(shè)置按鈕的
backgroundImage
否則沒動畫效果
[playBtn setImage:[UIImage imageNamed:@"voice_button_01"] forState:UIControlStateNormal];
//設(shè)置動畫圖片的資源
playBtn.imageView.animationImages = self.animateBtnArrM;
//設(shè)置動畫的持續(xù)時間
playBtn.imageView.animationDuration = 1.5;
//設(shè)置動畫的執(zhí)行次數(shù)
playBtn.imageView.animationRepeatCount = MAXFLOAT;
//開始動畫
[playBtn.imageView startAnimating];
15、使用SDWebImage 加載 gif圖片 url 巢价,不能壓縮牲阁,否則無法正常顯示
加載GIF 可以 用webView 加載,UIWebView 有緩存壤躲,WKWebView 在 iOS 9 之后才有情況緩存的接口
16城菊、滾動視圖(UIScrollView 、UITableView碉克、UIWebView凌唬、WKWebView、UICollectionView)界面點(diǎn)擊事件漏麦,添加點(diǎn)擊手勢需要實(shí)現(xiàn)其中一個代理方法客税,才有點(diǎn)擊效果
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
return YES;
}
17、cocoapod search 不到所需的庫
-
rm ~/Library/Caches/CocoaPods/search_index.json
執(zhí)行完重新 search 就行
18撕贞、設(shè)置UITextField 水印居中
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 200, 200, 30)];
textField.borderStyle = UITextBorderStyleLine;
textField.placeholder = @"hello world";
UILabel *label = [textField valueForKey:@"_placeholderLabel"];
label.textAlignment = NSTextAlignmentCenter;
[textField setValue:label forKey:@"_placeholderLabel"];
[self.view addSubview:textField];
19更耻、優(yōu)雅地隱藏顯示導(dǎo)航欄
- 遵守協(xié)議
<UINavigationControllerDelegate>
- 設(shè)置代理
self.navigationController.delegate = self;
- 重寫方法
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated{
BOOL isVC = [viewController isKindOfClass:[self class]];
[self.navigationController setNavigationBarHidden:isVC animated:YES];
}
20、OC 的 指針麻掸,swift 的表示方法:
static const void* mainQueueKey = @"mainQueue";
static void* mainQueueContext = @"mainQueue";
private let mainQueueKey = UnsafeMutablePointer<Void>.alloc(1)
private let mainQueueValue = UnsafeMutablePointer<Void>.alloc(1)
21酥夭、swift 實(shí)現(xiàn)KVO以及提供給OC調(diào)用
- 需要使用@dynamic 和 @objc使用,默認(rèn)如果使用@dynamic swift會隱式添加@objc
22脊奋、swift 使用runtime
- 如果是純swift類熬北,要使用runtime需要加上@dynamic,如果是直接或者間接繼承NSObject(這個還是動態(tài)執(zhí)行的)诚隙,就可以直接使用runtime
23讶隐、宏定義的 attribute((visibility ("default"))) 作用
visibility屬性是設(shè)置將本項目的函數(shù)作為庫使用時的可見性。g++編譯時, 加入-fvisibility=hidden參數(shù), 會將所有默認(rèn)public屬性設(shè)為hidden, 導(dǎo)致庫外文件不可見
如果設(shè)置了attribute((visibility ("default")))的函數(shù), 其public屬性仍能對外可見, 而不是hidden久又∥籽樱可見編譯指令 -fvisibility是對所有屬性符號進(jìn)行處理, 而attribute((visibility ("default")))是對特定函數(shù)可見性進(jìn)行設(shè)置, 避免沖突效五。
原文地址
24、ARC 下使用 autoreleasepool
- 如果你創(chuàng)建太多的臨時對象在你的代碼中炉峰,你會注意到你的內(nèi)存用量會增加直到對象被釋放掉畏妖。問題是內(nèi)存只有在UIKit排空(drains)自動釋放池的時候才能被釋放,這意味著內(nèi)存被占用的時間超過了需要疼阔。好消息是你可以在你的@autoreleasepool段中創(chuàng)建臨時對象來避免上述情況
NSArray *urls = <# An array of file URLs #>;
for (NSURL *url in urls) {
@autoreleasepool {
NSError *error;
NSString *fileContents = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:&error];
/* Process the string, creating and autoreleasing more objects. */
}}
25戒劫、監(jiān)聽橫豎屏切換
- 橫豎屏切換的時候,系統(tǒng)會響應(yīng)一些函數(shù)婆廊,其中
viewWillLayoutSubviews
和viewDidLayoutSubviews
迅细。
26、并發(fā) 和 并行的區(qū)別
并發(fā):當(dāng)有多個線程在操作時,如果系統(tǒng)只有一個CPU,則它根本不可能真正同時進(jìn)行一個以上的線程淘邻,它只能把CPU運(yùn)行時間劃分成若干個時間段,再將時間 段分配給各個線程執(zhí)行茵典,在一個時間段的線程代碼運(yùn)行時,其它線程處于掛起狀宾舅。.這種方式我們稱之為并發(fā)(Concurrent)统阿。
并行:當(dāng)系統(tǒng)有一個以上CPU時,則線程的操作有可能非并發(fā)。當(dāng)一個CPU執(zhí)行一個線程時贴浙,另一個CPU可以執(zhí)行另一個線程砂吞,兩個線程互不搶占CPU資源,可以同時進(jìn)行崎溃,這種方式我們稱之為并行(Parallel)蜻直。
區(qū)別:并發(fā)和并行是即相似又有區(qū)別的兩個概念,并行是指兩個或者多個事件在同一時刻發(fā)生袁串;而并發(fā)是指兩個或多個事件在同一時間間隔內(nèi)發(fā)生概而。
例子:
1).并發(fā) 一個送外賣的A需要把兩份外賣分別送到兩個客戶B和C手里。 A必須先送完B外賣才能接著送C的囱修。這就是并發(fā)
2).并行 客戶C 分別從餓了么和美團(tuán)訂了一共兩份外賣赎瑰。那么外賣員A和外賣員B需要把外賣一同送到客戶C手里。 這就是并行
27破镰、 使用Instrument 的time profiler 調(diào)試
- 默認(rèn)是不會顯示方法名餐曼,需要項目中開啟
Build Settings
->Build Options
->Debug
->DWARF with dSYM File
28、設(shè)置collectionView header 懸浮
- 設(shè)置 shouldInvalidateLayoutForBoundsChange屬性為 YES就好