1. 程式人生 > >[iOS崩潰]App鍵盤彈出後進入後臺crash

[iOS崩潰]App鍵盤彈出後進入後臺crash

問題

全域性替換NSArray,NSMutableArray,NSDictionary,NSMutableDictionary等集合的方法(比如objectAtIndex:,addObject:,setObject:forKey:等等)去去獲取一些安全性時(避免新增nil到陣列,或者nil成為字典的key,value等情況)。

也會帶來一個問題,在ARC編譯環境下:

App彈出鍵盤後,進入後臺,會crash

堆疊在:

Thread : Crashed: com.apple.main-thread
0  libobjc.A.dylib                6806634868 objc_release + 20
1  libsystem_blocks.dylib         6813456656 _Block_release + 256
2  libobjc.A.dylib                6806640420 (anonymous namespace)::AutoreleasePoolPage::pop(void*) + 564
3  CoreFoundation                 6529519172 _CFAutoreleasePoolPop + 28
4  UIKit                          6605817924 _wrapRunLoopWithAutoreleasePoolHandler + 76
5  CoreFoundation                 6530394704 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 32
6  CoreFoundation                 6530382300 __CFRunLoopDoObservers + 360
7  CoreFoundation                 6530383292 __CFRunLoopRun + 836
8  CoreFoundation                 6529519780 CFRunLoopRunSpecific + 396
9  GraphicsServices               6682260900 GSEventRunModal + 168
10 UIKit                          6606283712 UIApplicationMain + 1488
11 Spec                           4297532060 main (main.m:15)
12 libdyld.dylib                  6813280776 start + 4

開啟 Enable Zombie Objects,可以看到崩潰時控制檯有輸出:

-[UIKeyboardLayoutStar release]: message sent to deallocated

這裡謹慎的懷疑是相關操作去release了NSArray或者NSMutableArray物件,但是在我們全域性替換那些方法時,是使用了ARC編譯的,是不需要手動release的,可能這就造成了多次release.

解決辦法

  1. 最直接簡單的是去掉這些集合的方法swizzle,但這樣會失去原來想要得到的特性
  2. 設定這些實現檔案的編譯選項為-fno-objc-arc

相關參考

相關推薦

[iOS崩潰]App鍵盤進入後臺crash

問題 全域性替換NSArray,NSMutableArray,NSDictionary,NSMutableDictionary等集合的方法(比如objectAtIndex:,addObject:,setObject:forKey:等等)去去獲取一些安全性時(避

周記3——解決fixed屬性在ios鍵盤失效的bug

images fff 發現 apple load http none orien 兩種方法   這周在做空間(“類似”qq空間)項目。首頁是好友發表的說說,可以針對每條說說進行評論,評論框吸附固定在屏幕底部。此時,Bug來了...在ios上,軟鍵盤彈出後fixed屬性失效了

KeyboardUtil【軟鍵盤輸入框上移一定的高度】

together true 添加 存儲 oge 底部 putty 如果 original 版權聲明:本文為HaiyuKing原創文章,轉載請註明出處! 前言 演示獲取軟鍵盤高度並保存,然後根據輸入框的原有位置是否被軟鍵盤擋住了,如果被擋住了則將整體頁面上移一定的高度,當

關於ListView中EditText在軟鍵盤的焦點問題

在ListView中,每次彈出軟鍵盤後就會重新呼叫getView()方法,導致EditText失去焦點。 解決辦法:在getView()方法中新增監聽器: editText.setOnTouchListener(new OnTouchListener() {            @Override  

鍵盤,Activity變形,popupWindow遮蓋住。

"adjustUnspecified" It is unspecified whether the activity's main window resizes to make room for the soft keyboard, or whether the c

鍵盤,Activity變形,popupWindow遮蓋住

"adjustUnspecified" It is unspecified whether the activity's main window resizes to make room for the soft keyboard, or whether the con

解決移動端文字框被原生鍵盤擋住文字框

記一次,解決移動端文字框彈出鍵盤遮擋輸入框的方法: document.activeElement.scrollIntoViewIfNeeded(); 方法用來將不在瀏覽器視窗的可見區域內的元素滾動到

iOS UITextView 隨鍵盤介面上移

- (void)textViewDidBeginEditing:(UITextView *)textView {     CGRect frame = textView.frame;     i

鍵盤又消失的問題

問題:三星手機,帶有底部選單欄自動隱藏的功能,當開啟此項功能時,在Activity中點選開啟鍵盤時,會導致鍵盤彈出後,馬上消失掉; 解決: 方法一:設定手機總是顯示底部選單欄,問題解決; 方法二:當進入該Activity時,手動隱藏底部選單欄: 在Activity的o

移動端頁面鍵盤導致body高度變低背景圖片被擠上去解決方法

本身在設定背景圖片的時候是將html,body的高度設為100%,然後.main{ height: 100%; background: url('../assets/images/[email protected]') no-repeat left top;

iOS中處理鍵盤時,scrollview或者tableview的調整

http://www.cnblogs.com/dcty/archive/2012/03/11/2390403.html 以前的做法和這個比起來簡直就是xxxx,今天看官方的參考庫又學了一招~ 以前的實現效果和這個是一樣,不過程式碼上比這個多了點 程式清單5-1  處理鍵盤

Ionic3學習筆記(九)關於 Android 端軟鍵盤介面被壓縮的問題

本文為原創文章,轉載請標明出處 今天做了一個如下圖所示的頁面。 iOS 端毫無 bug,Android 端卻出現了問題。當軟鍵盤彈出後,Android 端的 tabs 移到了軟鍵盤的上面,再仔細一看,整個介面都被壓扁了,輸入框也不知道去哪兒了。 於是去

ios鍵盤擋住帶自定義UITableViewCell的UITableView的解決方法

案例: 需要做一個UITableView,其包含兩個section,其中一個section中的cell是UITableViewCell類物件,另一個section中的cell是自定義的Cell類物件,自定義的Cell是一個表單,裡面包含有多個UITextField。 遇

h5相容安卓和iOS鍵盤影響佈局的坑

這個是真的坑!!!!!!!!!!!1、先看看正常頁面長什麼樣子,號碼是我亂輸入的,大家不要亂打= =2、然後再看看輸入號碼後鍵盤把這個訂單確認的框頂上去了,頂上去對大螢幕手機也沒關係,就是對小螢幕手機會把訂單確認訂到被隱藏一些。點選鍵盤的下符號後,鍵盤收起來,但是訂單確認這個

處理安卓和ios當頁面原生鍵盤,輸入框不顯示

client clas bsp 安卓 ios lin style lint targe $(‘input‘).on(‘click‘, function () { var target = this; //

iOS-關於鍵盤和關閉

在iOS模擬器上,打印出不同手機型號鍵盤彈出的寬高: iPhone4s,width:320 height:253; iPhone5/5s:width:320 height:253; iPhone6/6s:width:375 height:258; iPhone6 Plus/

iOS 鍵盤與回收、介面上移和下移

//新增通知,來控制鍵盤和輸入框的位置     [[NSNotificationCenterdefaultCenter] addObserver:selfselector:@selector(ke

iOS鍵盤完美移動控制元件

新增監聽(最好放在ViewWillAppear裡, 在檢視將要消失時移除監聽) 這裡監聽鍵盤Frame的變化而不是監聽鍵盤的顯示和隱藏 [[NSNotificationCenter defaultCe

iOS鍵盤的時候會擋住底部的控制元件,可以通過以下方法將整個UIView上移。

//通知中心addObserver [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(transformView:) name:UIKeyboardWillChangeFr

iOS UITextField輸入框隨鍵盤介面上移

//點選輸入框介面跟隨鍵盤上移 - (void)textFieldDidBeginEditing:(UITextField *)textField { CGRect frame = textF