gpt4 book ai didi

objective-c - 选择器 ID 是否对参数类型敏感?

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:14:36 24 4
gpt4 key购买 nike

当您使用 @selector() 检索选择器的 ID 时,选择器值是否因参数类型而异?

这就是我的意思。我有一个采用对象引用和选择器的方法,然后使用参数调用它:

-(void)CallLater:(NSObject*) Obj Sel: (SEL)Sel
{
//Some stuff, then:
[Obj performSelector: Sel withObject: SomeOtherObject];
}

我将此方法与一个选择器一起用于一个函数,该函数采用类型化对象引用,而不是 id:

-(void)MyMethod: (MyObject*) a
{
}

[self CallLater: self Sel:@selector(MyMethod:)];

它似乎有效,但我的感觉很刺痛。在像 C# 这样的静态类型语言中,这将是一种犯规,一个向上转换 - CallLater 期望一个函数的选择器接受一个 id 而我给它一个函数需要一个 MyObject

另一方面,编译器并没有提示,id 和具体的对象引用似乎只是深层的指针,可以简单地相互转换。话又说回来,有很多 Objective C 编译器不会提示的错误。

所以真正的问题是 - 它安全吗?欢迎语言律师。

最佳答案

很安全;对象是对象。 NSObject * 的选择器参数与 MyObject * 的选择器参数完全相同。

如果您希望 MyMethod 验证它是否被特定类型的对象调用,它应该对其执行 NSParameterAssert:

NSParameterAssert([obj isKindOfClass: [MyObject class]]);

就我个人而言,我很少做这项检查。实际对象表现 就像我希望它成为的类型就足够了,如果不是这样,我会得到一个运行时错误(通常是无法识别的选择器)。在简单的情况下,您会收到编译器警告,值得关注此警告(并在必要时使用 id 转换将其静音)。

我在这里对您在问题中使用 id 有点困惑,所以我想确保您理解这一点:NSObject * 完全一样id 作为 MyObject * 是。 id 是一个通用实例指针类,而 NSObject * 是一个 NSObject 实例(或 NSObject 的子类) .您可以拥有不是从 NSObject 派生的对象。但你不太可能永远都必须知道这一点。

其他注释,关于:约定:

  • 选择器(名称和参数)以小写字母开头,因此 CallLater:Sel: 应该是 callLater:sel:
  • 变量名和参数名以小写字母开头;上面的Obj应该是obj
  • 类名确实以大写字母开头。 :)

关于objective-c - 选择器 ID 是否对参数类型敏感?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11571781/

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