NSNumberの範囲?
-
05-09-2019 - |
質問
長々と書きましたが、Objective-Cクラスを使用しているの共有インスタンスで複数のビューのiPhoneます。そのメンバ変数を含bools,int,NSStrings一NSNumber.の共有インスタンスらしい仕事には、イブレア城、イブレアの範囲のを除き、本会はお申し込みのNSNumberのデバッガからは"対象外"の共有インスタンスアクセスされた第2回以降です。
こちらの一覧かになっている...
// 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員は、がん細-この故に私はstumped.そのアイデア?
解決
なぜ性を最大にできます。 grossWage
accessors(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ško Heveryその他の物品は彼のブログです。
他のヒント
あなたがまたはプロパティを使用してすべきではないはずですので、あなたが問題を抱えている理由はありませんが、メモリ管理規則をフォローしていないので。するNSNumberはオブジェクトであり、そして、あなたのセッターに保持されるべきです。プロパティにそれを変更すると、Objective-Cのは、あなたのための作業を処理しているため、当面の問題を修正しますが、それはあなたがそれに慣れまで問題を持ち続けるつもりだ100%間違いないので、あなたはまだメモリ管理を見直すべきです。
の@ zoulのポイントにフォローアップ...
私は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
それはそれをクリアしない場合は、を参照してください。
これは愚かに聞こえるが、ゼロによる除算をチェックします。私は同じエラーを持っていた理由は、ゼロによる除算だっます。