Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c Obj-C在同一类中的静态方法的静态方法上使用@selector?_Objective C_Static_Callback_Selector_Static Methods - Fatal编程技术网

Objective c Obj-C在同一类中的静态方法的静态方法上使用@selector?

Objective c Obj-C在同一类中的静态方法的静态方法上使用@selector?,objective-c,static,callback,selector,static-methods,Objective C,Static,Callback,Selector,Static Methods,我在同一个类中有两个静态方法/选择器,一个将另一个作为回调传递给外部方法。然而,我是如何编码的,我得到了一个错误。当这两个方法都是实例方法时,它就起作用了。我已经读到,当第一个方法是使用[self class]的实例方法时,它就起作用了。然而,当这两个都是静态的时,我还没有找到信息,而且我还没有让它工作 +(void)Validate { Callback *managerCallback = [[[Callback alloc] initWithTarget:self Action:@

我在同一个类中有两个静态方法/选择器,一个将另一个作为回调传递给外部方法。然而,我是如何编码的,我得到了一个错误。当这两个方法都是实例方法时,它就起作用了。我已经读到,当第一个方法是使用[self class]的实例方法时,它就起作用了。然而,当这两个都是静态的时,我还没有找到信息,而且我还没有让它工作

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

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

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

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


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

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

赫普·达德普。戴夫是对的

鉴于此:

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

+(void)Parse:(Callback *)managerCallback {
    ...
}
一些评论:

  • 方法应以小写字母开头

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

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


结果表明,代码编写正确,可以实现我想要的功能,但由于回调设置为自动释放,因此在处理回调之前对象已被释放。

只是一些样式提示:
验证和
解析都应该以小写字母开头,init方法应该是
initWithTarget:action:`(选择器的每个部分都以小写字母开头)。Objective-C没有静态方法。是的,谢谢,但是我如何设置它来调用类方法呢?是吗<类方法中的code>self
,因此如果目标是
,选择器是
Parse:
,那么(大概)回调将执行
[target performSelector:action with object:foo]
,它应该调用
+[MyClass Parse:
。。。我错过了什么吗?我现在是怎么写的?当它试图回调时,它会抛出一个exc_bad_访问异常。更正,我遇到的问题是回调对象在调用方法之前是自动释放的。方法应该以小写字母开头:谢谢,这是我从C#/.Net养成的习惯。