0

拡張する必要があるメソッドに追加の動作を追加する必要があります。つまり、次のようなメソッドを実装します

- (void)extendMethod:(SEL)selector forClass:(Class)class withCompletionBlock:(void (^)(void))completionBlock;

Classしたがって、インスタンスがSELセレクターを使用してメソッドを呼び出すたびに、さらに完了ブロックを呼び出す必要があります

メソッドの入れ替えを試みましたが、いくつかの問題に遭遇しました。元のメソッドの実装を呼び出したいのです。

必要なものはサブクラス化と非常に似ていますが、これはサブクラス化せずに実装する必要があります。

アップデート:

たとえば、UIViewControllernamedのサブクラスがありMyViewControllerます。MyViewController方法があり- (void)viewDidLoadます。アプリケーションのどこかでメソッドを呼び出します

[methodExtender extendMethod:@selector(viewDidLoad)
                    forClass:[MyViewController class]
         withCompletionBlock:^{
             NSLog(@"view did load called");
         }];

したがって、MyViewController のすべてのインスタンスの viewDidLoad メソッドの後、完了ブロックが呼び出されました。

4

4 に答える 4

0

スウィズリングを使用すると、元の実装を呼び出すことができますが、少し混乱します。スウィズリング後に実装が交換されるため、スウィズルされたメソッドのセレクターを使用して元の実装を呼び出します。

- (void)mySwizzledImplementation {
    // do stuff
    // now call original implementation (using swizzled selector!)
    [self mySwizzledImplementation];
    // do more stuff
}

http://cocoadev.com/wiki/MethodSwizzlingも参照してください。

于 2013-05-10T14:56:56.473 に答える