Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone NSN编号超出范围?_Iphone_Objective C_Cocoa_Memory Management_Nsnumber - Fatal编程技术网

Iphone NSN编号超出范围?

Iphone NSN编号超出范围?,iphone,objective-c,cocoa,memory-management,nsnumber,Iphone,Objective C,Cocoa,Memory Management,Nsnumber,我已经编写了一个Objective-C类,并且在iPhone项目的几个视图中使用了它的共享实例。其成员变量包括bools、int、NSStrings和一个NSNumber。共享实例似乎在我的应用程序的整个范围内都正常工作,除了NSNumber,调试器告诉我,一旦第二次或以后访问共享实例,NSNumber就超出了范围 下面是我正在做的一个快速概述 // UserData.h @interface UserData : NSObject { TaxYears selectedTaxYear;

我已经编写了一个Objective-C类,并且在iPhone项目的几个视图中使用了它的共享实例。其成员变量包括bools、int、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
从另一个角度看也是如此。但是第二次访问它时,grossWage成员超出了范围,但其他一切都很好——这就是为什么我被难住了。有什么想法吗?

为什么要手工编写grossWage访问器updateGrossWage和getGrossWage?您确定只想分配给定的总工资,而不是保留或复制它吗?这样,当调用者摆脱其毛工资实例时,您将在userData对象中得到已发布的毛工资:

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

另外,像用户数据这样的共享对象通常不利于您的设计=导致代码的痛苦,请参见Miško Hevery和他博客上的其他文章。

为什么要手工编写grossWage访问器updateGrossWage和getGrossWage?您确定只想分配给定的总工资,而不是保留或复制它吗?这样,当调用者摆脱其毛工资实例时,您将在userData对象中得到已发布的毛工资:

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


另外,像用户数据这样的共享对象通常不利于您的设计=导致代码中的痛苦,例如Miško Hevery和他博客上的其他文章。

跟进@zoul的观点

我要声明grossWage是一个属性,并合成getter和setter。我认为塞特是你问题的根源

// in UserData.h
@interface UserData : NSObject {
    NSNumber *grossWage; 
}

@property (nonatomic, retain) NSNumber *grossWage; 



// in UserData.m
#import "UserData.h"

@implementation UserData
@synthesize grossWage;

// then do NOT create getters and setters for grossWage

看看这是否还不清楚。

继续@zoul的观点

我要声明grossWage是一个属性,并合成getter和setter。我认为塞特是你问题的根源

// in UserData.h
@interface UserData : NSObject {
    NSNumber *grossWage; 
}

@property (nonatomic, retain) NSNumber *grossWage; 



// in UserData.m
#import "UserData.h"

@implementation UserData
@synthesize grossWage;

// then do NOT create getters and setters for grossWage

看看这是否还不能解决问题。

您遇到问题的原因不是因为您应该或不应该使用某个属性,而是因为您没有遵守内存管理规则。NSNumber是一个对象,应该保留在setter中。将其更改为属性将解决眼前的问题,因为Objective-C正在为您处理工作,但是您仍然应该检查内存管理,因为它100%确定您将继续出现问题,直到您满意为止。

出现问题的原因不是您应该或不应该使用某个属性,而是您没有遵守内存管理规则。NSNumber是一个对象,应该保留在setter中。将其更改为属性将解决眼前的问题,因为Objective-C正在为您处理工作,但您仍然应该检查内存管理,因为它100%确定您将继续遇到问题,直到您满意为止。

这听起来很愚蠢,但请检查是否被零除。我也有同样的错误,原因是被零除。

这听起来很愚蠢,但请检查是否被零除。我也有同样的错误,原因是被零除。

我编写了访问器,正如我在开始时预期的那样,我可能希望对成员执行强制转换或其他操作。。。但现在看来,为了简单起见,我可以去掉它们了。我只是试图绕过访问器方法,将grossWage定义为@property并直接设置它,它似乎做到了这一点。。。非常感谢!如果这不是问题所在,我会回来的。看起来我需要阅读更多关于内存管理的内容。我按照一开始的预期编写了访问器,我可能希望对成员执行强制转换或其他操作。。。但现在看来,为了简单起见,我可以去掉它们了。我只是试图绕过访问器方法,将grossWage定义为@property并直接设置它,它似乎做到了这一点。。。非常感谢!如果这不是问题所在,我会回来的。看来我需要多读一些关于内存管理的书。
// in UserData.h
@interface UserData : NSObject {
    NSNumber *grossWage; 
}

@property (nonatomic, retain) NSNumber *grossWage; 



// in UserData.m
#import "UserData.h"

@implementation UserData
@synthesize grossWage;

// then do NOT create getters and setters for grossWage