2009-05-26 14 views
1

私はObjective-Cクラスを作成しました。私はiPhoneプロジェクトのいくつかのビューでその共有インスタンスを使用しています。メンバ変数にはbool、ints、NSStrings、NSNumberがあります。共有インスタンスは、共有インスタンスが2回目以降にアクセスされると、デバッガから私に「範囲外」と通知されたNSNumberを除いて、アプリケーションのスコープ全体で正常に動作しているようです。NSNumberが範囲外ですか?

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

と同じように、別のビューで:

はここで...だから、それはこのように一つのビューにアクセスした

// 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 

を私がやっているの概要です。しかし、2回目にアクセスすると、grossWageメンバーは範囲外ですが、それ以外のものは問題ありません。これが理由です。何か案は?

答えて

4

grossWageアクセサ(updateGrossWageおよびgetGrossWage)を手で書く理由を教えてください。そして、あなたは単純に、それを保持またはコピーするのではなく、単に与えられた総賃金を単に割り当てたいと思っていますか?あなたはuserDataオブジェクトにリリースグロス賃金で終わるだろう、発信者が彼の総賃金のインスタンスを取り除きます。この方法は:

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

これが問題の原因である可能性があります。もしそうでなければ、私は小さなものを完全なサンプルコードとして投稿することをお勧めします。


P.S. UserDataのような共有オブジェクトは通常、設計上(コードの苦痛につながります)悪いです。たとえば、MiškoHeveryのthis articleなどのブログを参照してください。 @のzoulのポイントにフォローアップ

+0

私は初めにメンバーにキャスティングや他の操作をしたいと思っていたようにアクセサーを書いていましたが、今は簡単にするためにそれらを取り除くことができるようです。私はアクセッサメソッドをバイパスしようとしました、grossWageを@propertyとして定義して直接設定し、それはトリックを行ったようです...多くの感謝!これが問題ではないことが判明した場合、私は戻ってきます。私はメモリ管理についてもう少し詳しく読む必要があるように見えます。 – moigno

0

...

私はgrossWageが財産であることを宣言し、ゲッターとセッターを合成するでしょう。私はセッターがあなたの問題の源だと思う。

// 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 

これでクリアされないかどうかを確認してください。

2

問題が発生している理由は、プロパティを使用する必要があるかどうかではなく、メモリ管理ルールに従わないためです。 NSNumberはオブジェクトであり、セッターに保持される必要があります。それをプロパティに変更すると、Objective-Cがあなたのために作業を処理しているため、直ちに問題を解決できますが、メモリ管理をレビューする必要があります。

0

愚かなように聞こえますが、ゼロ除算を確認します。私は同じエラーがあったし、理由はゼロによる除算でした。

関連する問題