Ios 尝试通过转发调用获取NSDate

Ios 尝试通过转发调用获取NSDate,ios,exc-bad-access,Ios,Exc Bad Access,我有个问题 我有办法 - (void)forwardInvocation:(NSInvocation *)anInvocation { SEL sel = anInvocation.selector; NSString *prop = [self.class fieldNameForSelector:sel]; if (prop) { BOOL setter = [self isSetter:sel]; __unsafe_unretained id obj; if (se

我有个问题

我有办法

- (void)forwardInvocation:(NSInvocation *)anInvocation {
SEL sel = anInvocation.selector;
NSString *prop = [self.class fieldNameForSelector:sel];
if (prop) {
    BOOL setter = [self isSetter:sel];
    __unsafe_unretained id obj;
    if (setter) {
        [anInvocation getArgument:&obj atIndex:2];
        [self setValue:obj forKey:prop];

    } else {
        obj = [self valueForKey:prop];
        [anInvocation setReturnValue:&obj];
    }
} else {
    [super forwardInvocation:anInvocation];
}
}

但如果我试图获取对象类NSDate或NSData,它在64位设备中不起作用。我得到
EXC\u BAD\u访问代码=1

还有来自僵尸的信息

[__NSDate retain]: message sent to deallocated instance 0x171e00d50

但对于另一种类型的对象,它是有效的。我怎样才能解决这个问题?谢谢

obj
可以在赋值后立即解除分配,因为它是一个
不安全的\u未恢复的
引用,所以
-setReturnValue:
获取悬空指针作为参数


如果设置器路径不可避免地存在
不安全的\u未恢复的
(因为
-[NSInvocation getArgument:atIndex:
可能无法在强引用下正常工作,感谢@Tommy注意到这一点),您可以使用强引用以不同的方式处理getter路径。

obj
可以在分配后立即解除分配,因为它是一个
不安全的\u未恢复的
引用,所以
-setReturnValue:
获取悬空指针作为参数


如果设置器路径不可避免地存在
不安全(unretained)
(因为
-[NSInvocation getArgument:atIndex:
可能无法与强引用一起正常工作,谢谢@Tommy注意到这一点),您可以使用强引用以不同的方式处理getter路径。

我试着这样做@Nikolay从发布的答案和文档中,看起来
getArgument:atIndex:
没有保留对象参数,因此如果他没有使用
unsafe\u unrepaired
,那么编译器会盲目插入一个版本,而不保留该对象。我认为作者的问题可能是为了避免出现问题,他然后错误地处理了
valueForKey:
路径。我试着像@Nikolay这样做,从发布的答案来看,从文档来看,
getArgument:atIndex:
没有保留对象参数,因此,如果他没有使用
不安全\u unrepaired
,那么编译器将盲目地插入一个版本,而不保留该对象。我认为作者的问题可能是为了避免出现问题,他随后错误地处理了
valueForKey:
路径。