iOS開發(fā)遇到的奇葩事

1忌栅、UITextField 和 UITextView 在 iOS7 下不能重寫 dealloc 方法

在 iOS7 的情況下曲稼,如果在 Category 重寫了 UITextField 或 UITextView 就會發(fā)生莫名其妙的崩潰問題。
得到崩潰的調(diào)用棧如下:

可以看出破衔,系統(tǒng)發(fā)出了一個通知钱烟,NSNotification,然后 Runloop 往 Observer 發(fā)送回調(diào)嫡丙,然后 UITextSelectionView 執(zhí)行 textSelectionViewActivated 的時候崩潰了拴袭。

很明顯在 iOS7 的情況下,iOS 系統(tǒng)默認會在 UITextField 和 UITextView 的 dealloc 方法下去釋放一些通知方法曙博,減少 Observer拥刻。所以上面我重寫了 dealloc 方法,在 iOS7 下不會去釋放通知父泳,導(dǎo)致 Runloop 發(fā)送了 通知方法的時候找不到對象般哼,從而野指針崩潰。


iOS系統(tǒng)使用第三方鍵盤收到三次 UIKeyboardWillShowNotification 通知

使用搜狗鍵盤惠窄,確實引起了不必要的麻煩蒸眠,哎,但是 UIKeyboardWillHideNotification 卻只會出現(xiàn)一次杆融,Lucky。
解決方法:

 NSDictionary* dict = [aNotification userInfo];
    CGRect endKeyboardFrame = [[dict objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    CGRect beginKeyboardFrame = [[dict objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];

    /**
     abson issu1: iOS使用第三方鍵盤的情況下池摧,收到三次鍵盤通知,傻B iOS 系統(tǒng)
     */
    if (isShowKeyBoard ) {
        if (false == (fitBeginKeyBoardFrame.size.height > 0 && fitBeginKeyBoardFrame.origin.y - fitEndKeyBoardFrame.origin.y)) {
            return;
        }
    }

iOS7的情況下宦棺,如果鍵盤還在顯示的時候成黄,旋轉(zhuǎn)屏幕央拖,系統(tǒng)會分別很快的發(fā)出 UIKeyboardWillHideNotification饶唤、UIKeyboardWillShowNotification 這兩個通知。

使用鍵盤的時候注意旋轉(zhuǎn)屏幕出現(xiàn)的這個惡心bug欣尼,如果不少心在 UIKeyboardWillHideNotification 的時候做動畫,并在動畫結(jié)束時執(zhí)行某些動做,例如如下:

那么就會有一個問題,因為系統(tǒng)很快就發(fā)出了 UIKeyboardWillShowNotification 這個通知册着,但是上圖的 manageViewPositionForKeyBoard:這個方法卻被 0.25秒后執(zhí)行了鞭执,而界面卻沒有發(fā)生變化大溜,從而導(dǎo)致數(shù)據(jù)錯亂的問題。

解決方法:加上一個屬性判斷動畫是否執(zhí)行中朦拖,如果 UIKeyboardWillShowNotification 引發(fā)的動畫在執(zhí)行中,那么睬隶,即使 0.25 秒后也不能讓他執(zhí)行 completion:這個 block。


iOS7 下兩次錄音會導(dǎo)致 record 方法返回 false
_audioRecorder = [[ AVAudioRecorder alloc] initWithURL:url settings:recordSettings error:&error];
_audioRecorder.delegate = self;
        
if ([_audioRecorder prepareToRecord] == YES){
    sleep(0);
    BOOL result = [_audioRecorder record];
    _isRecording = result;
}

如果上面代碼不添加 sleep(0), 就會導(dǎo)致 iOS7 [_audioRecorder record] 第二次創(chuàng)建的時候返回false贰锁。

sleep(0) 的作用:
Sleep(n)的作用是讓當前線程睡眠n毫秒,以便執(zhí)行其他線程,如果沒有其他線程芯肤,那睡眠n毫秒后油吭,繼續(xù)執(zhí)行歌豺。

而如果n=0,Sleep(0)是指CPU交出當前線程的執(zhí)行權(quán),讓CPU去執(zhí)行其他線程萧锉。也就是放棄當前線程的時間片鲫凶,轉(zhuǎn)而執(zhí)行其他線程。

一般來說掸屡,如果當前線程比較耗時比較占CPU資源仅财,可以在結(jié)尾處加上Sleep(0), 這樣效率會得到大大的提高碎罚。

另外,還可以用這種方法來保證線程同步耙考,線城池工作時,主線程使用Sleep(0)來等待線程池里所有的線程都完成運行。當線程池線程非常多的時候,這種方法確實是一種非常有效的節(jié)省 cpu 的方式,因為它節(jié)省了在線程里使用內(nèi)核來進行同步的開銷。

對比上面:
由于 [_audioRecorder prepareToRecord]為給錄音分配資源的api,包括內(nèi)部線程池分配資源等,所以,加上 Sleep(0) 目的在于等待其線程池資源分配成功磨隘。


iOS 的文件路徑保存數(shù)據(jù)庫不可保存全路徑
[[NSUserDefaults standardUserDefaults] setObject:filePath forKey:SocialAudioDataBase];

上面這句話中,如果 filePath 為 /var/mobile/Containers/Data/Application/A07505E5-9A3B-4CF2-B424-738294B1589F/Documents/94538510998/audio/94538510998/3351b914c4c937134c0f57efbc2dcb1b.wav 這樣的全路徑,下次取出 filePath 的時候,使用

bool result = [[NSFileManager defaultManager] fileExistsAtPath:audioPath]

result 會返回false。因為每次應(yīng)用運行的 Application/A07505E5-9A3B-4CF2-B424-738294B1589F 這個路徑都在改變。所以保存路徑不能保存全路徑,只能保存 Documents 文件夾后的部分路徑井辜,下次使用的時候刷允,再使用

     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
        NSString *documentsFilePath = [paths lastObject];
        NSString* fullPath = [documentsFilePath stringByAppendingPathComponent:savePath];

這樣去拼接得到全路徑路徑。


未完待續(xù)....

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子咸灿,更是在濱河造成了極大的恐慌囊榜,老刑警劉巖曙求,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件浴麻,死亡現(xiàn)場離奇詭異膏萧,居然都是意外死亡叉信,警方通過查閱死者的電腦和手機营袜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來嘲驾,“玉大人蓬衡,你說我怎么就攤上這事∫嫡ぃ” “怎么了雷滋?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵腊敲,是天一觀的道長。 經(jīng)常有香客問我勉失,道長胁出,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任筐喳,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸟缕。我一直安慰自己,他們只是感情好宴胧,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般廓块。 火紅的嫁衣襯著肌膚如雪拴清。 梳的紋絲不亂的頭發(fā)上会通,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天裳涛,我揣著相機與錄音,去河邊找鬼虚婿。 笑死矗钟,一個胖子當著我的面吹牛组贺,可吹牛的內(nèi)容都是我干的锣披。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼雹仿!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起整以,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤胧辽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后公黑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邑商,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年凡蚜,在試婚紗的時候發(fā)現(xiàn)自己被綠了人断。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡朝蜘,死狀恐怖恶迈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谱醇,我是刑警寧澤暇仲,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站副渴,受9級特大地震影響奈附,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜煮剧,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一斥滤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧勉盅,春花似錦佑颇、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至驱还,卻和暖如春嗜暴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背议蟆。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工闷沥, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咐容。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓舆逃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子路狮,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

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