1

私は Objective-C クラスを作成し、その共有インスタンスを iPhone プロジェクトのいくつかのビューで使用しています。そのメンバー変数には、bools、ints、NSStrings、および 1 つの NSNumber が含まれます。共有インスタンスは、共有インスタンスが 2 回目以降にアクセスされると、デバッガーが「範囲外」であると通知する 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

したがって、次のように 1 つのビューでアクセスできます。

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

そして、同じように別のビューで。しかし、2 回目にアクセスすると、grossWage メンバーは範囲外になりますが、それ以外はすべて問題ありません。これが私が困惑している理由です。何か案は?

4

4 に答える 4

4

なぜgrossWageアクセサ (updateGrossWagegetGrossWage) を手で書くのですか? そして、与えられた総賃金を保持したりコピーしたりするのではなく、単純に割り当てるだけでよろしいですか? このようにして、呼び出し元が総賃金インスタンスを取り除くと、userDataオブジェクトで解放された総賃金が得られます。

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

これが問題の原因である可能性があります。そうでない場合は、完全なサンプル コードの小さな部分を投稿することをお勧めします。通知はなく、呼び出し元のコンテキストが含まれています。


PS のような共有オブジェクトUserDataは通常、設計に悪影響を及ぼします (= コードの苦痛につながります)。たとえば、Miško Hevery によるこの記事や彼のブログの他の記事を参照してください。

于 2009-05-26T11:48:30.370 に答える
2

問題が発生している理由は、プロパティを使用する必要があるかどうかではなく、メモリ管理規則に従っていないためです。NSNumber はオブジェクトであり、セッターに保持する必要があります。これをプロパティに変更すると、Objective-C が作業を処理するため、当面の問題は修正されますが、メモリ管理を確認する必要があります。これは、慣れるまで問題が発生し続けることが 100% 確実であるためです。

于 2009-05-26T12:58:29.417 に答える
0

@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

それでも解決しないかどうかを確認してください。

于 2009-05-26T12:08:34.090 に答える
0

ばかげているように聞こえますが、ゼロ除算を確認してください。同じエラーが発生し、その理由はゼロ除算でした。

于 2009-05-26T13:49:35.977 に答える