1> 在引用第三方網(wǎng)絡(luò)框架是 最好是自己在封裝一層(防止以后替換)
2 >返回的數(shù)據(jù)可以用 [responseObject writeToFile:@"/路徑/xxx.plist" atomically:YES];寫(xiě)成plist文件查看柔袁,也可以用在線可折疊的 如 oschina 在線,或者鬼臉等軟件侯养。
3 >凡是包含 ScrollView的控件 系統(tǒng)都會(huì)自動(dòng)向下移動(dòng) 64 個(gè)點(diǎn) (au == NO ,或者坐標(biāo)生成 -64,或者者 contentInst)
4 >優(yōu)化程序 :減少字符串的操作 ? 減少定義變量 ?減少遍歷(for循環(huán)) 減少新對(duì)象的創(chuàng)建
5> 寫(xiě)出float x與“零值”比較的if語(yǔ)句 --> if(x>0.000001&&x<-0.000001)
6> View 的 clipsToBounds = YES? 切掉其余的 注意是View不是layer
7>老項(xiàng)目屏幕不拉伸問(wèn)題? 加一張 Default-568@2x.png
8>ping 指令 注意 :? ping www.baidu.com? 一定沒(méi)有 http://
9> 如何在? View 的圖層上添加一個(gè) image 华坦, contents 表示接受內(nèi)容self.customView.layer.contens = (id)[UIImage iamgeNamed:@"me"].CGImage;
10>iOS 在畫(huà)線的時(shí)候 線的粗細(xì)情況 (除以)[UIScreen mainScreen].scale
11> getter
- (NSMutableArray *)dataArray {if (_dataArray == nil) { _dataArray = [[NSMutableArray alloc] init];} return _dataArray;}
setter?
- (void)setDataArray:(NSMutableArray *)dataArray { _dataArray = dataArray;? //do something you need }
12> 快捷查看 IP ?
?1. 長(zhǎng)按 MAC 鍵盤(pán)上的 Alt/Option
?? 2.點(diǎn)擊菜單欄上的 Wi-Fi 按鈕
? ?3.找到目前連接網(wǎng)絡(luò)名字下方的 IP 地址即可
13>注意 : _xxx 和 self.xxx 和 self->xxx 的區(qū)別
_xxx 訪問(wèn)的是 xxx 的地址贩汉。
self.xxx 訪問(wèn)的是 xxx的 getter .
這兩者并不是完全等價(jià)的厕九, self.xxx 是 objc_msgSend 發(fā)消息, _xxx 或者 self->xxx 則是直接訪問(wèn)內(nèi)存地址。
一般建議在 init 里面用 _xxx剑逃, 其他地方用 self.xxx ,為什么呢官辽? 避免踩坑
14> 如何AFN保持線程的存活蛹磺,RunLoop
15> for循環(huán) ++i 要比 i++ 好一些
16 > runtime可以遍歷對(duì)象的屬性
? ? ? ? runtime可以動(dòng)態(tài)添加/修改屬性,動(dòng)態(tài)添加/修改/替換方法同仆,動(dòng)態(tài)添加/修改/替換協(xié)議
? ? ? ? runtime可以動(dòng)態(tài)創(chuàng)建類/對(duì)象/協(xié)議等等
? ? ? ?runtime可以方法攔截調(diào)用
17> tableView性能優(yōu)化
1萤捆、tableView的緩存機(jī)制.
2、在不等高Cell當(dāng)中,提前計(jì)算Cell的行高.提前估一個(gè)行高.200-250
3、如果說(shuō)Cell當(dāng)中有圓形圖片,圖片不要用ImageView加載layer.corneadius裁剪去做.會(huì)造成離屏渲染. 用繪圖Qurarzds裁剪,生成一張圓形的圖片.
4俗或、如果說(shuō)圖片的寬高,指定為小數(shù)點(diǎn).會(huì)造成鋸齒,造成鋸齒就會(huì)導(dǎo)致離屏渲染
5市怎、cell當(dāng)中的ImageView的大小最好是跟UIImage是一樣大,如果不一樣大 它會(huì)對(duì)UIImage做形變操作.cell當(dāng)中展示都是小圖.小圖的大小跟ImageView? 點(diǎn)擊放大,是再去用大的ImageView加載大圖.
6、做tableView的時(shí)候一定要用真機(jī).
7辛慰、如果是從網(wǎng)絡(luò)加載數(shù)據(jù),一定要放到子線程(異步加載)當(dāng)中做.
8探熔、加載完畢的數(shù)據(jù)一定做本地緩存.
9寒瓦、cell當(dāng)中不要?jiǎng)討B(tài)的添加子控件.一般都在創(chuàng)建時(shí),就把要出現(xiàn)的Cell給添加進(jìn)去,暫時(shí)不要顯示的,可隱藏.
10、盡量減少Cell內(nèi)部子控件的個(gè)數(shù).
11、如果控件非常多,把不需要與用戶進(jìn)行交互的控件.能過(guò)異步繪制出來(lái).生成一張圖片.把圖片添加到cell當(dāng)中
19> 寫(xiě)框架時(shí)如果有資源文件怎么辦臂外?(比如 圖片 音頻 視頻) 打成 ?.bundle ?[NSBundel mainBundle]
20> 自定義View? 里面的子控件frame 在哪里設(shè)置呢? - (void)layoutSubviews; 一定要【super layoutSubviews】 可以在 .h中寫(xiě)一個(gè)類方法暴露在外面,.m實(shí)現(xiàn) 【self alloc】init】;
注意返回類型 instancetype , 如果需要傳入模型 就定義一個(gè)屬性 重寫(xiě) setter 方法
21> iOS? init方法內(nèi)部 會(huì)自動(dòng)調(diào)用 initWithFrame:方法 研乒,所以在 initWithFrame:方法中創(chuàng)建UI
22>? NSStringFromClass(<#Class? _Nonnull __unsafe_unretained aClass#>)
? ? ? ? ?NSStringFromSelector(<#SEL? _Nonnull aSelector#>)
? ? ? ? ? NSStringFromCGRect(<#CGRect rect#>)
23> UISCrollView 如果想機(jī)制某一方向上的滾動(dòng) 就設(shè)置 contentSize 寬厚高為 0就可以了
24>? UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@""]];
等價(jià)于
UIImageView *imageView = [[UIImageView alloc] init];
imageView.image = [UIImage imageNamed:@""];
imageView.frame = CGRectMake(0, 0, imageView.image.size.width, imageView.image.size.height);
25> Array 用firstObject ?OR ?lastObject 比直接取數(shù)組 【0】下標(biāo)好止吁,防止崩潰
26> CGRectGetMaxX(<#CGRect rect#>)
? ? ? ?CGRectGetMaxY(<#CGRect rect#>)
27> 注意 不一定要賦值 delegate = self ,可以賦值給任意一個(gè)強(qiáng)引用對(duì)象?
為什么 挽封? 哈哈 原來(lái)是id呀
@property(nullable,nonatomic,weak) id ?<XXXDelegate> delegate;
28> 打印 Log 沒(méi)有代碼提示 已球??辅愿? 哈哈 由于你在前面寫(xiě)了 中文
29> 自定義一些類的時(shí)候 需要外界傳入《模型》或 《參數(shù)》 怎么辦 智亮?
重寫(xiě) 《模型》或 《參數(shù)》的 getter 方法
30> 移除某個(gè) View 的所有子控件 如何做呢 ? 遍歷点待?有一種更好的方法
[self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
31>
32> 如何正確加載 Xib
[[[NSBundle mainBundle] loadNibNamed:NSStringFromClass([self class]) owner:nil options:nil] lastObject];
33> 當(dāng)代碼初始化時(shí) 會(huì)自動(dòng)動(dòng)用 initWithFrame
? ?當(dāng)Xib初始化時(shí)? 會(huì)自動(dòng)調(diào)用 initWithCoder (還沒(méi)初始化完成) - (void)awakeFromNIb 初始化完成
34>AutoLayout 如何更改位置加動(dòng)畫(huà)呢 ? 把脫線--> 修改 ?之后 調(diào)用 [xxxView layoutIfNeed] ?就OK啦
35> Cell的 一些自定義屬性 separatorStyle分割線? selectionStyle選中狀態(tài) selectedBackgroundView選中背景 backgroundView默認(rèn)選中背景? accessoryType 指示器? accessoryView 指示器自定義View
36>? CGRectGetMaxX(<#CGRect rect#>)? //也就是把控件的frame 傳入進(jìn)去
? ? ? ? ? CGRectGetMaxY(<#CGRect rect#>)? //可用此方法計(jì)算cell的高度
37> - (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath? 估計(jì)Cell的高度 可以使 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 延遲調(diào)用
38> 項(xiàng)目中如果在VC里接收了通知癞埠,牢記一定要 在 - (void)dealloc{ [[NSNotificationCenter defaultCenter] removeObserver:self]; }
KVO 也如此
- (void)dealloc{ [self.XXX removeObserver:self forKeyPath:@"XXX"]; }
39> NSURLSession 的 delegate ?為什么用 retain 修飾 状原?對(duì)控制器的強(qiáng)引用也就是為了能夠正常的進(jìn)行后臺(tái)下載的操作。?
40>
2. 字面數(shù)值
NSNumber *someNumner = @1;
NSNumber *intNumner = @1;
NSNumber *floatNumner = @2.5f;
NSNumber *doubleNumner = @3.14159;
NSNumber *charNumner = @'s';
3. 字面量數(shù)組
NSArray *array = @[@"a",@"b"@"c"];
NSString *string = array[0];
4. 字面量字典
NSDictionary *dict = @{@"key":@"value"};
NSString *string = dict[@"key"];
5. 可變數(shù)組與字典
NSMutableArray *mutable = [@[@"a",@"b"] mutableCopy];
41> ?幾時(shí)調(diào)用[[NSNotificationCenter defaultCenter] removeObserver:self] ?
官方例子中是在viewWillAppear的時(shí)候添加苗踪,viewWillDisappear的時(shí)候remove颠区。
42>手機(jī)錄音或通話時(shí),app界面整體下移
當(dāng)你的iphone在錄音或者通話時(shí)通铲,打開(kāi)app你會(huì)發(fā)現(xiàn)毕莱,整個(gè)界面都下移了20像素,這個(gè)問(wèn)題對(duì)于scrollView颅夺、tableView等可以垂直滾動(dòng)的視圖可能沒(méi)有太大影響朋截,但是對(duì)于那些不能滾動(dòng)的視圖,就有可能底部被遮蓋20像素
43>點(diǎn)擊導(dǎo)航欄下方也會(huì)觸發(fā)導(dǎo)航欄按鈕的點(diǎn)擊事件
如圖所示吧黄,每次想選中右上角的圖片部服,結(jié)果總是觸發(fā)“取消”事件,明明沒(méi)有點(diǎn)到導(dǎo)航欄上面去拗慨,問(wèn)題的原因不清楚饲宿,解決方法創(chuàng)建一個(gè)UINavigationBar的分類厦酬,重寫(xiě)hitTest方法
如果觸摸點(diǎn)不在它上面,就不讓它接收用戶交互瘫想,然后使用系統(tǒng)的事件處理方法去處理
44>輸入中文時(shí)限制字符長(zhǎng)度
45> 修改導(dǎo)航欄顏色 ?
self.navigationController.navigationBar.barTintColor = [UIColor blueColor];
46 >當(dāng)有導(dǎo)航控制器時(shí)仗阅,系統(tǒng)會(huì)默認(rèn)將第一個(gè)添加的scrollView或其子類視圖的內(nèi)容下移64個(gè)像素,下面的textView是先添加的国夜,所以其內(nèi)容被下移了减噪,而上面的卻沒(méi)有,解決方法是在控制器里加上下面這句代碼
self.automaticallyAdjustsScrollViewInsets = NO;
47>iOS8才出來(lái)的车吹,用來(lái)替換UISearchBar + UISearchDisplayController的組合方式筹裕,項(xiàng)目中有用到搜索功能,于是筆者就嘗試著用了一下UISearchController窄驹,將搜索框添加到了tableView的tableHeaderView上朝卒。然而當(dāng)點(diǎn)擊搜索框準(zhǔn)備搜索時(shí),神奇的事情發(fā)生了
搜索框居然飛到九霄云外去了乐埠,好難過(guò)抗斤,這不是我要的那種結(jié)果,結(jié)果.....
怎么解決呢丈咐?在控制器里加上下面這句代碼就OK了瑞眼,至于為什么,呵呵棵逊,不知道
self.definesPresentationContext = YES;
48> 用戶名 密碼 存在 keychain 中
49> 后臺(tái)返回(null) 是 nil ?---->?if(m_result==nil)
<null>? NSNull ? ?if([m_result isEqual:[NSNUll null]])
50>NSString 首尾去掉空格
(1)系統(tǒng)去首尾空格方法伤疙,使用NSString中的str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]方法只是去掉左右兩邊的空格;
(2)替換的方法辆影,使用NSString *strUrl = [urlString stringByReplacingOccurrencesOfString:@" " withString:@""];可以去掉空格
51> 設(shè)置navigationBar上的title顏色和大小
[self.navigationController.navigationBar setTitleTextAttributes:@{NSForegroundColorAttributeName: [UIColoryouColor],NSFontAttributeName: [UIFontsystemFontOfSize:15]}]
51>獲取app緩存大小
- (CGFloat)getCachSize {NSUIntegerimageCacheSize = [[SDImageCache sharedImageCache] getSize];//獲取自定義緩存大小//用枚舉器遍歷 一個(gè)文件夾的內(nèi)容//1.獲取 文件夾枚舉器NSString*myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];NSDirectoryEnumerator*enumerator = [[NSFileManagerdefaultManager] enumeratorAtPath:myCachePath];? ? __blockNSUIntegercount =0;//2.遍歷for(NSString*fileNameinenumerator) {NSString*path = [myCachePath stringByAppendingPathComponent:fileName];NSDictionary*fileDict = [[NSFileManagerdefaultManager] attributesOfItemAtPath:path error:nil];? ? ? ? count += fileDict.fileSize;//自定義所有緩存大小}// 得到是字節(jié)? 轉(zhuǎn)化為MCGFloattotalSize = ((CGFloat)imageCacheSize+count)/1024/1024;returntotalSize;}
52>清理app緩存
- (void)handleClearView {//刪除兩部分//1.刪除 sd 圖片緩存//先清除內(nèi)存中的圖片緩存[[SDImageCache sharedImageCache] clearMemory];//清除磁盤(pán)的緩存[[SDImageCache sharedImageCache] clearDisk];//2.刪除自己緩存NSString*myCachePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Library/Caches"];? ? [[NSFileManagerdefaultManager] removeItemAtPath:myCachePath error:nil];}
53>打印百分號(hào)和引號(hào)
NSLog(@"%%");
NSLog(@"\"");
NSLog(@"%@",NSStringFromSelector(_cmd));
NSLog(@"%s",__FUNCTION__);
54> runtime?
// 獲得所有的成員變量
unsigned int outCount = 0;
Ivar *ivarList = class_copyIvarList([UIPageControl class], &outCount);
// 遍歷所有的成員變量
for (int i = 0; i < outCount; i++) {
// 獲得第i個(gè)成員變量
Ivar ivar = ivarList[i];
// 獲得成員變量的名稱和類型
NSLog(@"%@ -> %s = %s", [UIPageControl class], ivar_getName(ivar), ivar_getTypeEncoding(ivar));
}
// 釋放資源
free(ivarList);
55> self -> _name = @"xiao ming"; ? -> 訪問(wèn)類的實(shí)力變量
56 > block 和 函數(shù)指針類似 ? block() ; ? 不調(diào)用就不執(zhí)行哦
NSString 不用 加 _ _block 因?yàn)?NSString本來(lái)就在堆上?
NSMutableString *str = [NSMutableString stringWithFormat:@"123"];
// self.str = str;
_str = str;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[str appendString:@"456"];
NSLog(@"change");
NSLog(@"string is %@ %@",str,_str);
});
57> 如何修改 readonly 屬性 ?用KVC ?setValue for keyPath
===============未完================