iPhone上变量的内存管理

时间:2009-05-18 15:41:20

标签: iphone

我知道这是一个基本的探索,但我没有找到一个好的答案。我有一个带有多个视图控制器的应用程序,我注意到如果创建一个变量并在一个控制器上对其执行操作:

int foo = 0;
foo =+ 1;

我可以在另一个控制器中声明该变量而不初始化它的值,它将携带它在上一个视图控制器中最后设置的值:

int foo;
if (foo == 1)
    doSomething;

我已经利用这个优势来跟踪多人游戏中的当前玩家等...使用多个控制器中的数据来加载和移除他们的视图。我是Obj C的新手,根据我所读到的内容,这似乎不是正确的方法。

所以这是我的问题,这是一种在控制器之间传递数据的安全方法,如果不是我应该做什么?

4 个答案:

答案 0 :(得分:1)

听起来好像你在声明一个全局变量(C允许),并且它不是推荐的练习在视图控制器之间传递值。

你应该拥有一个状态对象,然后将它传递给需要它的控制器。

答案 1 :(得分:1)

这不是在控制器之间传递信息的安全方法。如果你在你的应用程序中使用它,并且它正在工作,我实际上非常惊讶。

执行此操作的正确方法是将所需的值从一个控制器传递到另一个控制器。下面的示例使用Application Delegate来存储值,然后每个控制器读取/写入它... 它只是一个示例,请注意使用Application Delegate作为有效全局变量的存储库< / strong>即可。在Application Delegate中设置大量变量以便以这种方式使用将使您的应用程序难以维护。

在App Delegate.h中

@interface AppDelegate : NSObject <UIApplicationDelegate> {  
  int sharedInt;  
}
@property int sharedInt; 

在您的App Delegate.m

@synthesize sharedInt;  // this will automatically create the getters and setters

然后在要设置值的控制器中:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate];  
applicationDelegate.sharedInt = 3;

然后在您想要读取值的控制器中:

ApplicationDelegateClassNameHere * applicationDelegate = [[ UIApplication sharedApplication] delegate];  
if (applicationDelegate.sharedInt == 3) {  
   //do your stuff here
}

已编辑:忘记了@synthesize 已编辑:根据Kenneth Ballenegger的建议,从委托单例方法中键入返回,以消除编译器警告。

答案 2 :(得分:1)

我建议做(和做)类似于mmc的回答。但是,他的回答会让你有很多警告。您应确保获得AppDelegate *个对象,而不仅仅是任何(id)对象(就像您使用mmc的方法一样)。

只需向您的委托添加+singleton(或+sharedDelegate)类方法,如下所示:

+ (iLaughAppDelegate *)singleton
{
    iLaughAppDelegate *delegate = (iLaughAppDelegate *)[[UIApplication sharedApplication] delegate];
    return delegate;
}

答案 3 :(得分:0)

如果正确完成,这很好,但只应对只读数据进行。这是共享字符串常量的一种非常常见的方法。例如:

MyObject.h

extern NSString* const MyObjectWillChangeNotification;

MyObject.m

NSString* const MyObjectWillChangeNotification = @"MyObjectWillChangeNotification";

AnotherObject.m

#import "MyObject.h"
// You can now use MyObjectWillChangeNotification in this file

同样的过程在技术上适用于您的int,但您不应该如前所述。允许任何给定变量由一个且仅一个对象管理更安全。其他人都应该通过访问器来实现它。