iOS 一些小技巧

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)中

18> 多線程 https://github.com/Timhbw/iOSInterviewQuestions/blob/master/iOS基礎(chǔ)問(wèn)答面試題連載-附答案/iOS基礎(chǔ)問(wèn)答面試題連載(三)-附答案.md

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>

默認(rèn)圖片寫(xiě)的是[UIImage imageNamed:@""]阔蛉,之后就報(bào)上面的錯(cuò)誤


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




===============未完================

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末徒像,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子蛙讥,更是在濱河造成了極大的恐慌锯蛀,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件键菱,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡今布,警方通過(guò)查閱死者的電腦和手機(jī)经备,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)部默,“玉大人侵蒙,你說(shuō)我怎么就攤上這事「吊澹” “怎么了纷闺?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,021評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵算凿,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我犁功,道長(zhǎng)氓轰,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,682評(píng)論 1 284
  • 正文 為了忘掉前任浸卦,我火速辦了婚禮署鸡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘限嫌。我一直安慰自己靴庆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,792評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布怒医。 她就那樣靜靜地躺著炉抒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稚叹。 梳的紋絲不亂的頭發(fā)上焰薄,一...
    開(kāi)封第一講書(shū)人閱讀 49,985評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音入录,去河邊找鬼蛤奥。 笑死,一個(gè)胖子當(dāng)著我的面吹牛僚稿,可吹牛的內(nèi)容都是我干的凡桥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,107評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蚀同,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼缅刽!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起蠢络,我...
    開(kāi)封第一講書(shū)人閱讀 37,845評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤衰猛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后刹孔,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體啡省,經(jīng)...
    沈念sama閱讀 44,299評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,612評(píng)論 2 327
  • 正文 我和宋清朗相戀三年髓霞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卦睹。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,747評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡方库,死狀恐怖结序,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情纵潦,我是刑警寧澤徐鹤,帶...
    沈念sama閱讀 34,441評(píng)論 4 333
  • 正文 年R本政府宣布垃环,位于F島的核電站,受9級(jí)特大地震影響返敬,放射性物質(zhì)發(fā)生泄漏遂庄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,072評(píng)論 3 317
  • 文/蒙蒙 一救赐、第九天 我趴在偏房一處隱蔽的房頂上張望涧团。 院中可真熱鬧,春花似錦经磅、人聲如沸泌绣。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,828評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)阿迈。三九已至,卻和暖如春轧叽,著一層夾襖步出監(jiān)牢的瞬間苗沧,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,069評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工炭晒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留待逞,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,545評(píng)論 2 362
  • 正文 我出身青樓网严,卻偏偏與公主長(zhǎng)得像识樱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子震束,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,658評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容