ObjecTips

Swift & Objective-C で iOS とか macOS とか

Runtime

Xcode 11.2 + Storyboard UITextView でクラッシュ

Xcode 11.2 で Storyboard か xib で UITextView を使っていると iOS 13.2 より前のバージョンでクラッシュするという凶悪なバグが発生している。 実際にクラッシュを起こしてみると以下の様に _UITextLayoutView ってクラスは無いとエラーメッセージが表示…

メソッド置換

Runtime API に method_exchangeImplementations というメソッド置換を行う関数がある。 メソッド交換、メソッド置き換え、メソッド入れ替えなどとも呼ばれる。 実装は簡単 objc/runtime.h をimportして Class cls; Method m1 = class_getInstanceMethod(cls…

UIKit の Private な UIGestureRecognizer その3

前回の続き id object = [[gestureRecognizer valueForKey:@"targets"] firstObject]; で取り出した Private な UIGestureRecognizerTarget クラスから target と action を取り出す。 target は KVO で取得できる。 id target = [object valueForKey:@"targ…

UIKit の Private な UIGestureRecognizer その2

NSLog(@"%@", gestureRecognizer); の出力結果って見辛いよねって事で、いい感じに調査をするために調査用のログ出力を試みてみる。 通常のログ出力 <UITextTapRecognizer: 0x7ff853734850; state = Possible; delaysTouchesEnded = NO; view = <MyTextField 0x7ff853725f30>; target= <(action=oneFingerTripleTap:, target=<UITextInteractionAssistant 0x7ff853724d50>)>; num…</uitextinteractionassistant></uitexttaprecognizer:>

クラス階層を調べる

Private なクラスに出会った時に、そのクラスの superClass がさらに Private だったりする事がある。 その時にさらに superClass に遡って、、とやるのも面倒なので一気にクラス階層を出力できるようにする。 実装方法は以下の記事と同じく Private なメソ…

Private なメソッド、プロパティ、インスタンス変数を調べる

クラスの Private なメソッド、プロパティ、インスタンス変数を調べるには Objective-C の Runtime API を使う。 メソッドは Method, プロパティは objc_property_t, インスタンス変数は Ivar 型で取得できる。 #import <objc/runtime.h> で Runtime API を import してそれ</objc/runtime.h>…