实例方法调用类方法调用实例方法

时间:2009-07-08 03:37:07

标签: iphone objective-c

总之,怎么样?

我有一个视图控制器,可以创建一些自定义对象。其中一个对象需要在控制器中调用一个方法。该对象看起来好像要在控制器中调用一个类方法,这可能没问题,除了控制器中的类需要调用控制器中的实例方法,并且它似乎不想这样做。这有意义吗?

如果没有,这是伪代码:


ViewController.m

#import "customObj.h"
-(void)viewDidLoad{
  foobar=@"string";//declared in ViewController.h
}
-(void)createObj{
  foobar=@"different string";
  customObj *customObjInstance=[[customObj alloc] init];
}

---

customObj.m

#import "ViewController.h"
-(void)callBack{
  [ViewController createObj];
}

好的,所以当callBack运行时,它会出错,说它正在寻找+ createObj(而不是-createObj)。我可以将createObj更改为类方法,但是设置foobar时出现问题,因为foobar在-viewDidLoad中初始化,我无法将其更改为+ viewDidLoad。我可以将foobar移到一个类方法中,但那我该怎么称呼呢?而不是自我,我指的是[ViewController ...]?我觉得这不行。

我的猜测是我错过了一些基本的概念,并不像我正在做的那样困难。我感激任何能够理顺我的人。

非常感谢。

2 个答案:

答案 0 :(得分:5)

没有一个正确答案;它取决于您的自定义对象如何与控制器交互。大多数UIKit视图使用“目标 - 动作”模式与控制器进行通信,而许多模型对象使用委托模式。您使用哪一个取决于控制器和自定义对象的具体情况。

但是,机械地,您可能需要做的是在通过自定义初始化程序创建ViewController时传递指向customObj的指针,如下所示:

customObj *customObjInstance = [[customObj alloc] initWithController: self];

如果你这样做,请确保customObj与你的控制器紧密耦合是有意义的。

答案 1 :(得分:3)

你可能已经向我提出了各种类的提及,但是如果所有你的意思是控制器需要创建可以调用控制器的对象(创建更多相同的),我可以帮助你有。

我这样做了很多,正如约翰所提到的那样 - 使用委托模式:

为从对象到控制器的调用定义协议: 回调

//  CallBackDelegate.h


#import <Foundation/Foundation.h>

@protocol CallBackDelegate<NSObject>
- (void)callBack;
@end

在控制器的头文件中导入协议

#import "CallBackDelegate.h"

并指定控制器实现此协议:

@interface MyViewController : UIViewController < CallBackDelegate > 
{ ...   

同时在自定义对象类标题中也导入协议

#import "CallBackDelegate.h"

并添加符合协议的实例成员:

id<CallBackDelegate> delegate;

和一个属性,必须分配不保留或你将有循环保留,控制器和自定义对象将相互保留,这意味着他们永远不会解除分配

@property(assign) id<CallBackDelegate> delegate;  

(此成员不必称为委托)

然后确保在视图控制器创建自定义对象时,它将自己设置为委托

customObject.delegate = self; 

然后在您的自定义对象中,您可以安全地执行此操作:

[ delegate callBack];

希望有所帮助, 垫

如果你搜索苹果示例代码,你会找到类似的例子:

[委托touchesEnded:触及withEvent:event];

当然,如果您希望方法将id传递给创建的对象,则该方法不需要像我的示例中那样返回(void)

如果你愿意,你可以编写一个init方法,该方法将代理作为john也建议

customObj * customObjInstance = [[customObj alloc] initWithController:self];

在initWithController中,您传入的控制器需要被指定为委托