1

ObjC ランタイム ライブラリまたは Cocoa を使用して、メソッドから返された後など、オブジェクトが作成されたときに通知を受ける方法はありinitますか?

オブジェクトを変更したり、サブクラス化したりせずに(NSObjectたとえば、サブクラス化せずに)、メソッドの入れ替えをせずに(私はすでにその方法を知っています)、これを実現したいと考えています。

4

2 に答える 2

1

デフォルトでは、ランタイムはこれを記録しません。私はあなたがこれを望まないので、スウィズリングを使用すると思います...オブジェクトをプロキシでラップするというCodaFiのアイデアが最善だと思いますが、これは手動で行う割り当てのオプションにすぎませんAFAICS

本当に透明にしたいならやっぱりスウィズル

于 2013-03-31T20:37:16.807 に答える
1

メソッドが実行されたときに通知を受ける認可された方法はありません。ただし、通知、または何らかのコールバック、ブロックなどへのポインターを返すことを特に明記していない限りです。おそらくあなたの最善の策です。クラス全体のセレクターをいじる代わりに、クラスのすべてのプロパティを実装したり、セレクターをターゲット オブジェクトに転送したりすることで、自分自身をクラスとして介入させます。このように、NSProxy とサブクラスは、通常のオブジェクトのラッパーとして使用できます。つまり、プロキシ経由で送信されたあらゆる種類のメソッドに応答してから、ターゲットに転送できます。単純なプロキシは、以下のサンプルをモデルにして作成できます。

FOUNDATION_EXPORT NSString *const CFIProxyDidInitializeTargetNotification;

@interface CFIObjectProxy : NSProxy {
    __strong Foo *_target;
}

- (id)init;

@property(nonatomic, readonly, retain) NSArray* bars;

@end

//...

#import "CFIObjectProxy.h"

NSString *const CFIProxyDidInitializeTargetNotification = @"CFIProxyDidInitializeTargetNotification";

@implementation CFIObjectProxy

- (id)init {

    _target = [[Foo alloc]init];
    [NSNotificationCenter.defaultCenter postNotificationName:CFIProxyDidInitializeTargetNotification object:nil];

    return self;
}

- (void)forwardInvocation:(NSInvocation *)invocation {
    [invocation invokeWithTarget:_target];
}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
    return [_target methodSignatureForSelector:sel];
}

- (NSString *)description {
    return [_target description];
}

- (NSString *)debugDescription {
    return [NSString stringWithFormat:@"<%@:%p> Proxy for Object: %@", NSStringFromClass(self.class), self, _target];
}

- (NSArray*)bars {
    return [_target bars];
}

@end
于 2013-03-31T20:38:46.410 に答える