我正在尝试使用 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/