我寫了一個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