我有这样的代码:
NSInvocation* invocation = [NSInvocation invocationWithMethodSignature:[self methodSignatureForSelector:@selector(updateFrame)]];
[invocation setTarget:self];
[invocation setSelector:@selector(updateFrame)];
displayLink_ = [[CADisplayLink displayLinkWithTarget:invocation selector:@selector(invoke)] retain];
[displayLink_ setFrameInterval:1];
[displayLink_ addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
在 iOS 6.0(在 5.1 中,此代码工作正常),当此代码调用时,我有两个变体:EXC_BAD_ACCESS 或“调用无法识别的选择器“调用””。看来 displayLinkWithTarget:selector: 方法不保留目标。当我添加 [调用保留] 行时,代码可以正常工作。是iOS 6.0的bug吗?
这是有用的相关信息,而不是答案。
而不是使用NSInvokation
您可以使用弱代理,就像我在对这个问题的实际回答中所做的那样。非常简单,代码如下:
JAWeakProxy.h:
#import <Foundation/Foundation.h>
@interface JAWeakProxy : NSObject
@property (weak, nonatomic) id target;
+ (JAWeakProxy*)weakProxyWithTarget:(id)target;
@end
JAWeakProxy.m:
#import "JAWeakProxy.h"
@implementation JAWeakProxy
+ (JAWeakProxy*)weakProxyWithTarget:(id)target
{
JAWeakProxy* newObj = [self new];
newObj.target = target;
return newObj;
}
- (BOOL)respondsToSelector:(SEL)sel
{
return [_target respondsToSelector:sel] || [super respondsToSelector:sel];
}
- (id)forwardingTargetForSelector:(SEL)sel
{
return _target;
}
@end
注意:这是 ARC 代码,您需要autorelease
in weakProxyWithTarget:
如果不使用 ARC。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)