访问控制器类中作用域外的对象

时间:2010-10-10 18:53:25

标签: objective-c cocoa

在我的控制器类中,我使用NSButton初始化模型类的两个实例(其标题已正确导入控制器类)。该模型非常简单,只有4个成员和一个方法 - attack()。制作一个愚蠢的文字游戏!

 - (IBAction)startGame:(id)sender {

    Combatant *hero = [[Combatant alloc] init];
    Combatant *enemy = [[Combatant alloc] init];
    [console insertText:@"You have created a hero! An enemy approaches...\n"];
 }

所以现在我有两个这样的物体。或者我呢?因为这个按钮,那个应该让他们战斗的按钮,不知道英雄和敌人是什么,或者他们有一种让他们“战斗”的阶级方法!

- (IBAction)attack:(id)sender{

[hero attack:enemy]; //Use of undeclared identifier, blah blah.
[console insertText:@"You attack the enemy! Woah!\n"];}

如果我在攻击方法中初始化了那些对象,那么我就可以使用它们,所以我认为这与范围有关。但是我不喜欢将模型对象发送到控制器方法的想法,这看起来很愚蠢。

让我道歉:是的,这是关于Cocoa结构的一个愚蠢的高级问题。抱歉。但我想你们其中一个人会确切知道我在做什么并告诉我这样做!

简而言之,在这种情况下,Cocoa的做事方式是什么?提前谢谢。

-Alec

1 个答案:

答案 0 :(得分:1)

在方法中声明变量时,它是 local 变量,这意味着它只存在于该方法中。您在函数中声明的变量也是如此。

如果您希望变量存在于类中的所有实例方法中,则需要将其设为 instance 变量,您可以通过在{ … }部分中声明该变量来实现该变量。 class @interface

请注意,您存储在实例变量中的任何对象,实例都应该拥有。这意味着三件事:

  1. 在将对象分配给实例变量之前,您需要保留对象(从而拥有它)或制作副本(您将拥有该副本)。
  2. 由于您拥有它,因此您需要在实例的dealloc方法中发布它。
  3. 如果你决定用另一个对象替换它,你需要释放前一个对象(因为你仍然拥有它)并保留或复制新对象(为了拥有它)。
  4. 有关详细信息,请参阅the Objective-C Programming Languagethe Memory Management Programming Guide