我写了一个Objective-C类,并在iPhone项目的几个视图中使用它的共享实例。它的成员变量包括bools,ints,NSStrings和一个NSNumber。共享实例似乎在我的应用程序范围内工作得很好,除非在第二次或以后访问共享实例时,调试器告诉我的NSNumber“超出了范围”。NSNumber超出范围?
下面是我在做什么的简要概述...
// UserData.h
@interface UserData : NSObject {
TaxYears selectedTaxYear;
NSNumber *grossWage; // <--- this is the troublesome member
// ...
NSString *other;
int age;
}
+ (UserData *)getSharedUserData;
@end
// UserData.m
#import "UserData.h"
@implementation UserData
static UserData *sharedUserData = nil; // Points to the shared object
+ (UserData *)getSharedUserData {
if(sharedUserData == nil) {
sharedUserData = [[UserData alloc] initWithTaxYear:0];
[[NSNotificationCenter defaultCenter]
addObserver:sharedUserData
selector:@selector(doTerminate:)
name:UIApplicationWillTerminateNotification
object:nil];
}
return sharedUserData;
}
- (id)initWithTaxYear:(TaxYears)theTaxYear {
if ((self = [super init])) {
}
return self;
}
- (void)updateGrossWage:(NSNumber *)theGrossWage {
grossWage = theGrossWage;
}
- (NSNumber *)getGrossWage {
return grossWage;
}
// ...
@end
所以它是在一个视图中访问这样的:
UserData *userData
userData = [[UserData getSharedUserData] retain];
而在以同样的方式另一种观点。但第二次访问时,毛工会员超出了范围,但其他一切都很好 - 这就是为什么我难倒了。有任何想法吗?
我写了访问器,正如我在开始时所预期的那样,我可能想要对成员执行投射或其他操作......但现在看起来我为了简单起见就可以取消它们。我只是尝试绕过访问器方法,将grossWage定义为@property并直接设置它,它似乎已经完成了这个技巧......非常感谢!如果事实证明这不是问题,我会回来的。看起来我需要更多地阅读内存管理。 – moigno 2009-05-26 12:05:54