gpt4 book ai didi

objective-c - 覆盖类别中的类实例方法时如何抑制链接器警告

转载 作者:太空狗 更新时间:2023-10-30 03:34:02 25 4
gpt4 key购买 nike

需要使用类别覆盖方法。我也知道这样做的危险(这是另一个类中的私有(private)类,没有人会编写另一个覆盖类别的方法,因此不能保证未定义的行为)。我见过很多类似的 questions但它们都解决了使用如下内容抑制编译器警告的问题:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"

// do your override

#pragma clang diagnostic pop

但是这仍然会留下链接器 警告。是否可以在 Xcode 4.6 中针对我认为安全的特定覆盖摆脱它?

这是一个 sample GitHub project说明问题。

最佳答案

好的,正如我在评论中解释的那样,您尝试做的事情很危险,不应该这样做。我还建议阅读 runtime documentation了解原因并了解实现目标的其他方法。你应该读一下。

在任何情况下,您正在做的事情的替代方法是使用运行时环境来“跳过”初始化层次结构中的一个类,从而有效地“覆盖”父类(super class),从而产生完全相同的结果而不会引发那么多危险信号方法。

这是如何完成的一个选项,在您的示例项目中,将 FunkyBranch 类实现更改为此:

#import "FunkyBranch.h"
#import <objc/runtime.h>

typedef id(*InitIMP)(id,SEL);

@implementation FunkyBranch

-(id) init
{
InitIMP superSuperInit = (InitIMP)class_getMethodImplementation([[self superclass] superclass], @selector(init));

self = superSuperInit(self, @selector(init));
if (self)
{
NSLog(@"FunkyBranch initialized");
}
return self;
}

@end

它会产生与您当前实现相同的结果,而不会出现您正在做的事情的危险。

请记住,将函数指针转换为正确的类型是最重要的,而且我仍然认为您应该重新考虑您的方法,而不是强制运行时做一些它不打算做的事情。无论如何,这回答了您的问题。

关于objective-c - 覆盖类别中的类实例方法时如何抑制链接器警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15293978/

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