gpt4 book ai didi

iphone - iOS 6.0 中的 CADisplayLink 不保留目标

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:11:24 25 4
gpt4 key购买 nike

我有这样一段代码:

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: 方法似乎没有保留目标。当我添加 [invocation retain] 行时,代码可以正常工作。是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 代码,如果不使用 ARC,您需要在 weakProxyWithTarget:autorelease

关于iphone - iOS 6.0 中的 CADisplayLink 不保留目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12532377/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com