1

有没有办法使用 ObjC 运行时库或 Cocoa 在创建对象时收到通知,例如,在从init方法返回之后?

我想在不修改对象或对其进行子类化(NSObject例如,没有子类)并且不进行方法调配(我已经知道如何做到这一点)的情况下实现这一点。

4

2 回答 2

1

默认情况下,运行时不会记录这一点。我想我会使用 swizzling 但是因为你不想要这个......我认为 CodaFi 将对象包装在代理中的想法是最好的,尽管这只是你手动执行 AFAICS 分配的一个选项

所以如果你想让它真正透明,毕竟我会说

于 2013-03-31T20:37:16.807 回答
1

方法执行时没有经过批准的通知方式,除非它特别指出它返回通知,或指向某种回调、块等的指针。虽然 swizzling 可能是处理它的一种方式,但代理是可能是你最好的选择。通过实现其所有属性和/或将选择器转发到目标对象,您可以将自己“作为”类插入,而不是弄乱整个类的选择器。通过这种方式,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 回答