2012-03-28 8 views
-1

私は以下のようなシングルトンを持っています。これはNSDictionaryのインスタンスを作成してデータを保持します。ここ.Hは次のとおりです。ここでシングルトンクラスでのNSDictionaryへのアクセス(コピーの作成なし)

@interface FirstLast : NSObject 

@property (strong, nonatomic, readonly) NSArray *firstArray; 
@property (strong, nonatomic, readonly) NSArray *lastArray; 
@property (strong, nonatomic, readonly) NSDictionary *fl; 

+ (FirstLast *) firstLast; 
- (NSDictionary *) tempDic; 

@end 

は、このすべてが正常に動作します.M

@implementation FirstLast 

@synthesize firstArray = _firstArray; 
@synthesize lastArray = _lastArray; 
@synthesize fl = _fl; 

+ (FirstLast *)firstLast { 
    static FirstLast *singleton; 
    static dispatch_once_t once; 
    dispatch_once(&once, ^{ 
     singleton = [[FirstLast alloc] init]; 
     NSLog(@"FirstLast instantiated"); 
    }); 
    return singleton; 
} 

- (NSDictionary *) tempDic{ 

    _firstArray = [[NSArray alloc] initWithObjects:@"Bob", @"Joe", @"Sally", @"Sue", nil]; 
    _lastArray = [[NSArray alloc] initWithObjects:@"Jones", @"Johnson", @"Thompson", @"Miller", nil]; 
    _fl = [NSDictionary dictionaryWithObjects:_firstArray 
            forKeys:_lastArray]; 
    NSLog(@"tempDic just made _fl at this address"); 
    NSLog(@"%p", _fl); 
    return _fl; 
} 

@end 

です。私は他の場所でtempDicへのアクセスを獲得しようとすると、

NSLog(@"VC is setting up tempDic"); 

[[WordsClues wordsClues] tempDic]; 

次のように:ビューコントローラでは、私は(あまりにも正常に動作します)初めてこのすべてのインスタンスを

NSInteger rIndex = arc4random_uniform(4) + 1; 
NSString *fname = [[[FirstLast firstLast].tempDic allValues] objectAtIndex:rIndex]; 

それが正常に動作しますが、このプロセスを繰り返すと、新しいtempDicが作成されるたびに繰り返されます。私はこれを知っているので、アドレスを与えるNSLogは毎回異なる答えを与える。私は本当に私のシングルトンが達成しようとしていると思っていた既存の辞書にアクセスしたいと思っています。明らかに私はtempDicに正しくアクセスしていないか、シングルトンが私のためにできることを誤解しているか、tempDicを間違って設定しています。目標は、tempDicの1つのコピーからランダムな値を取得し、tempDicのローカルコピーをその場所全体に書き込まないことです。ありがとう。

答えて

4

なぜ辞書を-tempDicに再作成しますか?

I.e.辞書のインスタンス化コードをinitに移動し、次にreturn _fl;tempDicに移動します。

心配する必要はありません。私たちはすべてそこに行ったことがあります。あなたのFirstLastクラスで

、のようなものとしてinitメソッドを実装します。

- init 
{ 
    self = [super init]; 
    if (self) { 
      _fl = ... create your dictionary here ...; 
    } 
    return self; 
} 

その後に-tempDic変更:

- (NSDictionary*)tempDic { 
    return _fl; 
} 

私は非常にあなたが良いイントロを読むことをお勧めしますObjective-C本へ。私は純真なので、​​ですが、利用できる本がたくさんあります。

あなたが求めている質問は、「オブジェクト指向プログラミングとは何か、そしてObjective-Cはどのように機能していますか?

質問にお答えします。 FirstLastはクラスであり、シングルトンパターンはそのクラスのインスタンスが1つだけ存在することを確認します。辞書の作成をinitメソッド(これは一度だけ呼び出され、インスタンス変数に作成された辞書への参照を格納する)に移動することで、複数の辞書インスタンスの作成を避けることができます。

+0

を行うことができます私は初心者だと完全に物事を行うための最善の方法を理解していないので、答えはあると思います。 '-tempDic'の内容を' -FirstLast'の中に移動すると言っていますか?あるいは別の '-init'メソッドを作成しますか?そして、 '-tempDic'は単に' _fl'を返すものになりますか?どのように見えるだろうか?ご協力いただきありがとうございます! –

+0

ありがとう、それはまさにそれです。今は素晴らしい作品です。私は 'FirstLast'もクラスを初期化していると思っていたと思いますが、明らかにそうではありません。 'FirstLast'は何を言っていますか?私は、それが何をしているのかを記述するための適切な用語/語彙を知らない(第2のインスタンスが発生するのを防ぐ以外に)。 –

1

tempDicを呼び出すたびに、その新しいコピーを作成します。あなたは、あなたのallocインスタンスに辞書を作成するためのコードを追加してから、ゲッターでそれを取得するだけです。

1

Alternativlyあなたはこの

- (NSDictionary *) tempDic{ 
    if(_fl == nil) 
    { 
     _firstArray = [[NSArray alloc] initWithObjects:@"Bob", @"Joe", @"Sally", @"Sue", nil]; 
     _lastArray = [[NSArray alloc] initWithObjects:@"Jones", @"Johnson", @"Thompson", @"Miller", nil]; 
     _fl = [NSDictionary dictionaryWithObjects:_firstArray 
            forKeys:_lastArray]; 
     NSLog(@"tempDic just made _fl at this address"); 
     NSLog(@"%p", _fl); 
    } 
    return _fl; 
} 
+0

これも興味深い選択肢です。ありがとう。私はbbumの提案を実装し、ちょうど非常に生産的なプログラミングのビットを持っていた。いったん私が "objective-c"なやり方を見たら、私は大きな進歩を遂げる。 –

関連する問題