【问题标题】:Obj-C using @selector on a static method from a static method in the same class?Obj-C 在同一个类中的静态方法的静态方法上使用@selector?
【发布时间】:2011-06-30 14:21:44
【问题描述】:

我在同一个类中有两个静态方法/选择器,一个将另一个作为回调传递给外部方法。但是,我如何对其进行编码时出现错误。这在两种方法都是实例方法时有效,并且我读过它可以在第一个方法是使用 [self class] 的实例方法时有效。但是,当两者都是静态的时,我还没有找到信息,而且我还没有让它工作。

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

谢谢!

【问题讨论】:

  • 只是一些样式提示:ValidateParse should begin with a lowercase letter, and the init method should be initWithTarget:action:`(选择器的每个部分都以小写字母开头)。
  • Objective-C 没有静态方法。

标签: objective-c static callback selector static-methods


【解决方案1】:

回调 *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];

该行代码设置为调用实例方法Parse:,而不是您定义的类方法。

Objective-C 没有静态方法。它有类方法和实例方法。

同样,您的方法应该以小写字母开头。

Herp-da-derp。戴夫是对的。

鉴于此:

+(void)Validate {
    Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@selector(Parse:)] autorelease];
    ...
}

+(void)Parse:(Callback *)managerCallback {
    ...
}

一些cmets:

  • 方法应以小写字母开头

  • 在这样的角色中使用一个类是非常奇怪的;即使您真的只需要其中一个,也请使用实例。至少,该实例是一个方便的存储桶,可以将状态放入其中,如果您需要两个,它将使将来的重构变得更加容易。

  • 上述模式假设(我假设)Callback 的实例被保留。对于回调、定时器和其他一些模式,这是典型的;保留目标,直到最后一次调用目标。然后释放(或自动释放)。但是,通知中心不这样做。通常也不会保留代表。

【讨论】:

  • 是的,谢谢,但是如何设置才能调用类方法呢?
  • 是吗? Class 方法中的selfClass,所以如果目标是Class 并且选择器是Parse:,那么(大概)Callback 将执行[target performSelector:action withObject:foo],它应该调用@987654330 @...我错过了什么吗?
  • 我现在是怎么写的,当它试图回调它时会抛出一个 exc_bad_access 异常。
  • 更正,我遇到的问题是回调对象在调用方法之前是自动释放的。取消自动释放修复它。
  • -方法应该以小写字母开头:谢谢,这是我从 C#/.Net 养成的习惯。
【解决方案2】:

结果证明代码编写正确,可以做我想做的事,但是因为回调被设置为自动释放,对象在回调被处理之前就被释放了。

【讨论】:

    猜你喜欢
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多