keywords: Textfield/UITextField/secureTextEntry/內(nèi)存泄漏
使用場(chǎng)景
近日蚜枢,用戶在使用我們的App
的時(shí)候,發(fā)現(xiàn)一個(gè)問(wèn)題议谷,就是UITextfield
在密文模式下庇楞,輸入一定長(zhǎng)度,出現(xiàn)卡死逗栽,閃退現(xiàn)象。剛開始以為是偶發(fā)性的失暂,結(jié)果用戶在重啟手機(jī)彼宠,重新打開應(yīng)用,問(wèn)題依然在弟塞。而在我自己的手機(jī)上凭峡,卻從來(lái)沒(méi)有出現(xiàn)過(guò)這個(gè)問(wèn)題,我的第一感覺可能是內(nèi)存泄漏决记。因此摧冀,我就使用Analyze
和Leaks
進(jìn)行檢測(cè)內(nèi)存問(wèn)題,發(fā)現(xiàn)并未出現(xiàn)內(nèi)存泄漏提示。
原因分析
所以索昂,當(dāng)時(shí)有考慮可能是另外的原因:
- 手機(jī)應(yīng)用系統(tǒng)版本
- 可能是三方庫(kù)Bug
有了問(wèn)題建车,就要去解決問(wèn)題,根據(jù)猜想椒惨,進(jìn)行驗(yàn)證
1.手機(jī)系統(tǒng)版本問(wèn)題
這個(gè)驗(yàn)證比較簡(jiǎn)單缤至,得知用戶手機(jī)系統(tǒng)版本為iOS 10.0.1
,于是找到一個(gè)相同版本的手機(jī)進(jìn)行測(cè)試康谆,發(fā)現(xiàn)當(dāng)textfield
為密碼模式的時(shí)候领斥,真的會(huì)出現(xiàn)卡死,而且此時(shí)內(nèi)存暴增沃暗,最終被系統(tǒng)kill
掉月洛。而在其他系統(tǒng)版本iOS10
之前版本,和iOS10.3
都沒(méi)問(wèn)題(iOS 10.0.2
~iOS 10.2
版本未測(cè)試)孽锥。所以考慮極有可能是因?yàn)橄到y(tǒng)版本問(wèn)題膊存。
2.排除三方庫(kù)Bug
為了排除三方庫(kù)引起的Bug
,于是我就創(chuàng)建一個(gè)demo
忱叭,不引入任何三方庫(kù)。
使用在storyboard
上拉一個(gè)UITextField
,設(shè)置如下圖:
在iOS 10.0.1
系統(tǒng)上運(yùn)行今艺,發(fā)現(xiàn)依然出現(xiàn)問(wèn)題韵丑,其他版本暫未發(fā)現(xiàn),如圖:
由此可見虚缎,這個(gè)問(wèn)題應(yīng)該是
iOS10.0.1
下UITextField
的一個(gè)Bug
撵彻,而不是三方庫(kù)引起的。
問(wèn)題所在
根據(jù)自己在storyboard
修改的textfield
的屬性实牡,一個(gè)一個(gè)的排查陌僵,發(fā)現(xiàn)當(dāng)Secure Text Entry
,設(shè)置為YES
且Font
的值大于Min Font Size
的值的時(shí)候创坞,就會(huì)出現(xiàn)這個(gè)問(wèn)題碗短。而當(dāng)Secure Text Entry
設(shè)置為NO
時(shí),卻一切正常题涨。由此推測(cè)是密碼模式下引起的問(wèn)題偎谁。
猜想
根據(jù)目前的情況來(lái)看,UITextField
在密碼模式下纲堵,輸入到一定長(zhǎng)度(這里的一定長(zhǎng)度巡雨,是根據(jù)textfield
的長(zhǎng)度而言),才會(huì)觸發(fā)內(nèi)存泄漏席函,造成卡死铐望。我們都知道,當(dāng)textfield
輸入的長(zhǎng)度達(dá)到一定值的時(shí)候,輸入的內(nèi)容會(huì)自動(dòng)變小正蛙,那么會(huì)不會(huì)是在這一瞬間引起的內(nèi)存泄漏呢督弓?帶著猜想,我進(jìn)行了下面的實(shí)驗(yàn)跟畅,在ViewController
中加入如下代碼:
//在視圖控制器的視圖的layoutSubviews方法被調(diào)用之前調(diào)用咽筋。 子類可以根據(jù)需要實(shí)現(xiàn)。 默認(rèn)是nop徊件。
- (void)viewWillLayoutSubviews{
[super viewWillLayoutSubviews];
NSLog(@"%@",NSStringFromSelector(_cmd));
}
//在視圖控制器的視圖layoutSubviews方法被調(diào)用之后調(diào)用奸攻。 子類可以根據(jù)需要實(shí)現(xiàn)。 默認(rèn)是nop
- (void)viewDidLayoutSubviews{
[super viewDidLayoutSubviews];
NSLog(@"%@",NSStringFromSelector(_cmd));
}
在明文模式下虱痕,當(dāng)輸入長(zhǎng)度達(dá)到一定值時(shí)睹耐,輸入內(nèi)容字體變小時(shí),發(fā)現(xiàn)果然會(huì)調(diào)用上面的兩個(gè)方法部翘,但只調(diào)用一次(除非再次變化)硝训,而密碼模式下,卡死的一瞬間新思,一直重復(fù)調(diào)用上面的兩個(gè)方法窖梁。這就證實(shí)了上面的猜想,在重新渲染的時(shí)候夹囚,發(fā)生了內(nèi)存泄漏纵刘。
另外,還發(fā)現(xiàn)一個(gè)問(wèn)題荸哟,純代碼創(chuàng)建UITextField
貌似假哎,不會(huì)出現(xiàn)上面的問(wèn)題。
總結(jié)
通過(guò)對(duì)比鞍历,發(fā)現(xiàn)這個(gè)問(wèn)題舵抹,只是會(huì)出現(xiàn)在xib
或者storyboard
創(chuàng)建UITextField
時(shí),純代碼創(chuàng)建不會(huì)出現(xiàn)這個(gè)問(wèn)題劣砍,所以極有可能是在iOS10.0.1
版本下惧蛹,xib
或者storyboard
的一個(gè)bug
。
解決方案
鑒于此秆剪,目前我能找到的解決方案:
- 升級(jí)手機(jī)系統(tǒng)赊淑。
- 密碼模式下,
Font
的值小于等于Min Font Size
的值仅讽。 - 使用代碼創(chuàng)建
UITextField
,不使用xib
或Storyboard
陶缺。
以上,才疏學(xué)淺洁灵,錯(cuò)誤之處饱岸,還請(qǐng)批評(píng)指正掺出。