知道何时创建对象

时间:2013-03-31 20:07:45

标签: objective-c cocoa objective-c-runtime

是否有任何方法可以在创建对象时(例如,从init方法返回后)通知ObjC运行时库或Cocoa?

我希望在不修改对象或继承它的情况下实现这一点(例如,NSObject上没有子类)并且没有方法调整(我已经知道如何做)。

2 个答案:

答案 0 :(得分:1)

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

所以,如果你想要它真正透明,那么我就会说:

答案 1 :(得分: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