gpt4 book ai didi

iphone - NSNumber 超出范围?

转载 作者:行者123 更新时间:2023-12-03 16:52:03 27 4
gpt4 key购买 nike

我编写了一个 Objective-C 类,并且在我的 iPhone 项目中的多个 View 中使用它的共享实例。它的成员变量包括 bools、ints、NSStrings 和一个 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

因此可以在一个 View 中访问它,如下所示:

UserData *userData
userData = [[UserData getSharedUserData] retain];

在另一个 View 中也以同样的方式。但第二次访问时,grossWage 成员超出了范围,但其他一切都很好 - 这就是我感到困惑的原因。有什么想法吗?

最佳答案

为什么要手动编写 grossWage 访问器(updateGrossWagegetGrossWage)?并且您确定您只是想简单地分配给定的总工资而不是保留或复制它吗?这样,当调用者删除他的总工资实例时,您最终将在 userData 对象中获得已释放的总工资:

NSNumber grossWage = [[NSNumber numberWithInt:12] retain];
[userData updateGrossWage:grossWage];
[grossWage release];
// Now userData’s grossWage points to released object.

这可能是问题的原因。如果没有,我建议发布一小段完整的示例代码 - 没有通知内容,但带有调用上下文。

<小时/>

附注像 UserData 这样的共享对象通常不利于您的设计(=导致代码痛苦),例如 this article作者:Miško Hevery 及其博客上的其他文章。

关于iphone - NSNumber 超出范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/910186/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com