在我的 Controller 类中,我使用 NSButton 初始化模型类的两个实例(其 header 已正确导入到 Controller 类中)。该模型非常简单,只有 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"];}
我知道,如果我在攻击方法中初始化了这些对象,那么我就可以使用它们,所以我认为这与范围有关。但我不喜欢将模型对象发送到 Controller 方法的想法,这看起来很愚蠢。
让我道歉:是的,这是一个关于 Cocoa 结构的愚蠢的、高级的问题。对不起。但我想你们中的一个人会确切地知道我没有做什么,并告诉我去做!
简而言之,在这种情况下 Cocoa 的做事方式是什么?提前致谢。
-亚历克
最佳答案
当您在方法中声明变量时,它是一个本地变量,这意味着它仅存在于该方法中。对于在函数中声明的变量也是如此。
如果您希望该变量存在于类中的所有实例方法中,则需要将其设为实例变量,方法是在 { … }
中声明它。类(class)的@interface
部分.
请注意,存储在实例变量中的任何对象都应由实例拥有。这意味着三件事:
- 在将对象分配给实例变量之前,您需要保留该对象(从而拥有它)或制作一个副本(然后您将拥有该对象)。
- 由于您拥有它,因此您需要在实例的
dealloc
中释放它。方法。 - 如果您决定用其他对象替换它,则需要释放以前的对象(因为您仍然拥有它)并保留或复制新对象(以便拥有它)。
参见the Objective-C Programming Language和 the Memory Management Programming Guide了解更多信息。
关于objective-c - 访问 Controller 类范围之外的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901705/