autoContentAccessingProxy

autoContentAccessingProxy

我正在尝试使用 http://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/nsobject_Class/Reference/Reference.html#//apple_ref/occ/instm/NSObject/autoContentAccessingProxy 中描述的 -[NSObject autoContentAccessingProxy]

我试图代理的对象实现了 NSDiscardableContent 协议(protocol)并且 -autoContentAccessingProxy 成功返回了一个非 nil 值。

但是,如果我尝试向代理发送消息,我总是会收到一个 NSInvalidArgumentException,原因是“*** -[NSProxy methodSignatureForSelector:] 调用!”。

我知道如果我正在编写自己的基于 NSProxy 的类,我将不得不实现 -methodSignatureForSelector: 方法,但在这种情况下,我没有编写代理,只是尝试使用由文档化方法提供的代理。对于它的值(value),我可以看到代理实际上是 NSAutoContentAccessingProxy 类型,所以我希望该类确实有 -methodSignatureForSelector: 的实现。

这是使用 NSPurgeableData 实例而不是我的自定义类的一小段代码。这个小块有完全相同的问题。

NSPurgeableData * data = [NSPurgeableData dataWithBytes:"123" length:3];
NSLog(@"data.length = %u", data.length);
id proxyData = [data autoContentAccessingProxy];
NSLog(@"proxyData.length = %u", [proxyData length]);    //  throws NSInvalidArgumentException!
[data endContentAccess];
[data release];

我对这里的 -autoContentAccessingProxy 方法有什么误解,还是完全被破坏了?

最佳答案

您可以通过重新实现 NSAutoContentAccessingProxy 类的功能来修复这个错误,但没有错误。我写过这样一个类: XCDAutoContentAccessingProxy 。在调用 autoContentAccessingProxy 函数之前替换 main 方法;这发生在 +load 方法中。因此,您要做的就是在您的应用程序中编译以下代码,并且autoContentAccessingProxy将按预期方式运行。

请注意,与我之前的答案不同,您实际上可以在运输应用程序中使用此解决方案。

#if !__has_feature(objc_arc)
#error This code must be compiled with Automatic Reference Counting (CLANG_ENABLE_OBJC_ARC / -fobjc-arc)
#endif


#import <Foundation/Foundation.h>
#import <objc/runtime.h>


@interface XCDAutoContentAccessingProxy : NSProxy

+ (XCDAutoContentAccessingProxy *) proxyWithTarget:(id)target;

@property (nonatomic, strong) id target;

@end


@implementation XCDAutoContentAccessingProxy

@synthesize target = _target;

static id autoContentAccessingProxy(id self, SEL _cmd)
{
    return [XCDAutoContentAccessingProxy proxyWithTarget:self];
}

+ (void) load
{
    method_setImplementation(class_getInstanceMethod([NSObject class], @selector(autoContentAccessingProxy)), (IMP)autoContentAccessingProxy);
}

+ (XCDAutoContentAccessingProxy *) proxyWithTarget:(id)target
{
    if (![target conformsToProtocol:@protocol(NSDiscardableContent)])
        return nil;

    if (![target beginContentAccess])
        return nil;

    XCDAutoContentAccessingProxy *proxy = [self alloc];
    proxy.target = target;
    return proxy;
}

- (void) dealloc
{
    [self.target endContentAccess];
}

- (void) finalize
{
    [self.target endContentAccess];

    [super finalize];
}

- (id) forwardingTargetForSelector:(SEL)selector
{
    return self.target;
}

- (NSMethodSignature *) methodSignatureForSelector:(SEL)selector
{
    return [self.target methodSignatureForSelector:selector];
}

- (void) forwardInvocation:(NSInvocation *)invocation
{
    [invocation setTarget:self.target];
    [invocation invoke];
}

@end

更新 此错误已在 OS X 10.8 上修复。根据 OS X Mountain Lion Release Notes :



因此,仅当您面向 OS X 10.7 或更早版本时才需要编译上述代码。

关于objective-c - -[NSObject autoContentAccessingProxy] 工作吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8015940/

10-11 14:25