0

我真的很挣扎,我知道这很容易,但我只是没有让它发挥作用。

我对 Obj-C 很陌生...

基本上,这个应用程序非常简单。

它堆积在模态视图控制器上,一个在另一个之上,直到用户得到结果的最后,然后它们都被关闭,用户可以重新开始。

例如,在每个模态视图控制器中,我想将 1 添加到我在第一个屏幕中声明的 int 中。

这是第一个视图 controller.h 中的声明

int total;

这就是我在第二个视图 controller.m 中所做的

FirstViewController *fvc = [[FirstViewController alloc] init];
[fvc setTotal:1]; //or the following, i can't see what the difference is
fvc.total = 1;

这似乎起到了作用,它设置了我在另一个视图中声明的变量。

但是,在第三个视图 controller.m 中,我这样做:

FirstViewController *fvc = [[FirstViewController alloc] init];
NSLog(@"Current total: %x", fvc.total);

这有效,因为我没有收到错误,但整数已重置为 0。理想情况下,它会说“1”,以表明它保留了该值...

我的问题是;如何在整个应用程序中重用和添加到这个整数?

也请提供与字符串相关的答案,因为我也想这样做。

对不起,我还在学习。

提前致谢。

4

2 回答 2

0

每当您使用 alloc 时,您都在创建一个新对象。您的新对象通常不知道您之前对另一个对象做了什么,因为它是同一类型的对象。

一般的策略是:当你创建你的第二个视图控制器时,给它一个对你现有 fvc 的引用,当你创建你的第三个视图控制器时,给它同样的引用。

(更好的办法是将您的共享数据放在它自己的对象中并传递它,但让我们首先控制对象寿命的理论。:-))

于 2012-04-04T22:30:16.997 回答
0

如果将变量定义为静态变量,它会在不同的实例中保留其值。你可以在你的课堂上这样做:

@interface FirstViewController : UIViewController

- (NSInteger)sharedValue;
- (void)setSharedValue:(NSInteger)value;

@end


@implementation FirstViewController

static NSInteger sharedValue = 0;

- (NSInteger)sharedValue
{
    return sharedValue;
}

- (void)setSharedValue:(NSInteger)value
{
    sharedValue = value;
}

@end

现在,您创建的任何 FirstViewController 实例都将共享 sharedValue 的相同副本,如果您将其设置在一个实例上,然后从另一个实例中获取它,它将按照您想要的方式工作。相同的过程适用于字符串等,但如果您不使用 ARC,请注意保留和释放 sharedValue。

比在类上创建多个静态值更好的方法是创建一个共享类,您可以在该类上设置和获取多个属性。这些共享类有时被称为“单例”,因为它们是具有单个实例的类。

您可以看到 Apple 使用单例的许多地方,例如 [UIApplication sharedApplication]、[NSNotificationCenter defaultCenter]、[NSUserDefaults standardUserDefaults] - 这些都是在整个应用程序中重用单个实例的类的示例。

要创建单例,请创建一个类型为 NSObject 的新类,如下所示。然后,您可以添加您想要的任何属性,并通过 sharedInstance 在应用程序的任何位置访问它们:

@interface MyObject : NSObject

@property (nonatomic, assign) NSInteger someInteger;
@property (nonatomic, strong) NSString *someString;

+ (MyObject *)sharedInstance;

@end


@implementation MyObject

@synthesize someInteger, someString;

+ (MyObject *)sharedInstance
{
    static MyObject *sharedInstance = nil;
    if (sharedInstance == nil)
    {
        sharedInstance = [[self alloc] init];
    }
    return sharedInstance;
}

@end

您现在可以通过说在应用程序的任何位置访问共享属性

[MyObject sharedInstance].someInteger = 5;

...

NSInteger value = [MyObject sharedInstance].someInteger;

这绝对是在您的应用程序中存储全局数据的最佳方式。

于 2012-04-04T22:34:45.703 回答