我真的很挣扎,我知道它有多容易,但我只是没有让它发挥作用。
我对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;
这似乎可以解决问题,它设置了我在另一个视图中声明的变量。
但是,在第3个视图controller.m中,我这样做:
FirstViewController *fvc = [[FirstViewController alloc] init];
NSLog(@"Current total: %x", fvc.total);
这是有效的,因为我没有得到错误,但整数已重置为0.理想情况下,它会说'1',以显示它保留了值...
我的问题是;如何在整个应用程序中重用并添加此整数?
请同时回答与字符串相关的答案,我也想这样做。
对不起,我还在学习。
提前致谢。
答案 0 :(得分:0)
每当使用alloc时,您都在创建一个新对象。您的新对象通常并不知道您之前对另一个对象做了什么,只是因为它是同一类型的对象。
一般策略是:当您创建第二个视图控制器时,为它提供对现有fvc的引用,并在创建第三个视图控制器时,为它提供相同的参考。
(更好的做法是将你的共享数据放在其自己的对象中并传递它,但让我们首先控制对象寿命的理论。:-))
答案 1 :(得分:0)
如果将变量定义为static,则会在不同实例中保留其值。你可以在你的班级里这样做:
@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;
这绝对是在您的应用中存储全局数据的最佳方式。