iOSのアプリ開発をする時に、よくやってしまいがちな不具合の内容と対策メモです。
UILabelが長すぎて他の要素と被る、文字が切れる
詳細
constraintの設定が正しくされていなかったり、そもそもデザインに問題があるなど。
対策
- 必ずユーザーが入力する項目は文字数制限をする
- 開発環境で各項目の最大長データを用意して表示テストを行う
tableViewをスクロールするとcellの状態が元に戻る
詳細
tableView:cellForRowAtIndexPathがスクロールして複数回呼ばれると、ボタンのstatusが変更されていても、APIから初回取得したデータで書き換わってしまうなど。下記のような画面で起こる。
対策
- アクションがあったらUIButtonのステータスを変える+データの書き換えも行う
UITableViewCellやUICollectionViewCellに意図しない画像が表示される
詳細
cellにUIImageViewがある場合、セルのキャッシュが原因で同じ画像が表示されてしまったりすることがあります。
対策
下記のようにcellのクラス内でprepareForReuseを使って使い回すタイミングで初期化します。
- (void)prepareForReuse
{
// セルが画像をキャッシュして、同じ画像が表示されてしまうので初期化
self.imageView.image = nil;
}
データが0件の場合の表示がおかしい
詳細
表示するデータが0件だった時にインジケータが表示され続けていたり、画面が真っ白だったり、
特定の件数以上の表示ができないなど。
対策
- 0件の表示テストを行う
ページングがループしてしまう
詳細
tableViewなどで下部までスクロールしたらページングする実装などで、2ページ目以降も1ページ目と同じ内容が表示されてしまったりする不具合
対策
- 1ページに表示する件数より多いデータでテストを行う
- ページングのリクエストに正常にパラメータが渡っているかテストする
新規ユーザーだけで発生する不具合
詳細
アプリをアップデートしたケースでは発生しないが、新規でDLするとバグが発生するケース。
対策
- 必ず新規DL&ユーザー登録のパターンでテスト
delegateのメソッドがEXC_BAD_ACCESSになる
詳細
delegateのprotocol宣言をassignでしていたため、破棄された後にcallされると発生する
対策
宣言はweakで宣言する
NSDictionaryやNSArrayにnilやnullが入ることを考慮していない
詳細
objective-cのNSDictionaryやNSArrayはnilやnullの代入を許可していないので、意図せず代入すると NSInvalidArgumentExceptionが発生する
対策
代入前にチェックする
インジケータを通信処理が始まった後に表示させている
詳細
APIとの通信を開始する前にインジケータを表示させるのが本来の実装ですが、誤って通信開始後にインジケータを表示させてしまうと、通信が早い場合にインジケータが通信後に表示されてしまうという問題が発生します。
対策
必ずインジケータの表示は通信処理の前に行う
自戒
開発中はクラッシュなどに慣れてきてスルーしがちです。リリース後に問題になるものの中には、自分が既にクラッシュしているものだったということもあります。
必ず多少の異変やクラッシュも見逃さないように気にかけるようにしましょう。。