2017-01-21 10 views
0

私のObjective-Cの経験は良くありません。NSMutableDictionaryを動作させることができません(xcode)

他にもいくつかのコードがありますが、私はこの問題を単純化したと考えています。私は何をしようとしていることは保存することですダブル以下の私のコードで、キーと(のNSNumberにパック):今、このプリント

の.h

@interface MyClass : something 
{ 
    MyMap* usemap; 
} 
@end 

@interface MyMap : something 
@property (atomic, strong) NSMutableDictionary* mmap; 
@end 

.M

@implementation MyMap 
@class MyClass; 
NSMutableDictionary* mmap = [[NSMutableDictionary alloc] init]; 
@end 

@implementation MyClass 
MyMap* usemap = [MyMap alloc]; 

//-void { switch() { case x: 
NSString* key = @"testkey"; 
NSNumber* value = [NSNumber numberWithDouble:1]; 
NSLog(@"Saving value: %@ to key: %@",value,key); 
[usemap.mmap setObject:value forKey:key]; 
NSNumber* get = [usemap.mmap objectForKey:key]; 
NSLog(@"Saved value: %@ to key: %@",get,key); 

Saving value: 1 to key: testkey 

Saved value: (null) to key: testkey 

何が欠けていますか?それは倍数 '1'を保存していたはずです。

+0

あなたの 'mmap'は初期化されていません。 '@ implementation'の直下にあるコードは意味がなく、実行されていません(少なくとも期待するときは)。コードをイニシャライザまたはいくつかのメソッドに置きます。 – werediver

+0

私はそれを - (void)コンストラクトに移動しました。これは割り当て直後に実行されます。それは助けになりませんでした:/ – user2105624

+0

Okey!それを修正! :私はself.mmap = [[NSMutableDictionary alloc] init]を使用しなければなりませんでした。 allocの後に呼び出されるvoid関数の中にあります。自己なしで。まずそれは動作しませんでした。 – user2105624

答えて

1

あなたはMyClassのinitメソッドをオーバーライドし、それusemap = [[MyMap alloc] init]でマイマップを初期化する必要があります。その後、MyMapのinitメソッドをオーバーライドし、mmapをself.mmap = [[NSMutableDictionary alloc] init]に初期化します。

MyClassの残りの部分は、initメソッドをオーバーライドします。ここではラフスケッチです:

の.h

@interface MyClass : something 
{ 
    MyMap* usemap; 
} 
@end 

@interface MyMap : something 
@property (atomic, strong) NSMutableDictionary* mmap; 
@end 

.M

@implementation MyMap 
@class MyClass; 

- (instancetype)init { 
    if ((self = [super init])) 
     self.mmap = [[NSMutableDictionary alloc] init]; 

    return self; 
} 

@end 

@implementation MyClass 

- (instancetype)init { 

     if ((self = [super init])) 
     { 
       usemap = [[MyMap alloc] init]; 

       NSString* key = @"testkey"; 
       NSNumber* value = [NSNumber numberWithDouble:1]; 
       NSLog(@"Saving value: %@ to key: %@",value,key); 
       [usemap.mmap setObject:value forKey:key]; 
       NSNumber* get = [usemap.mmap objectForKey:key]; 
       NSLog(@"Saved value: %@ to key: %@",get,key); 
     } 

    return self; 
} 
@end 

はそれが役に立てば幸い!

0

これを試してみてください:

MyMap.h:

#import <UIKit/UIKit.h> 

@interface MyMap : NSObject 
@property (atomic, strong) NSMutableDictionary* mmap; 
@end 

MyMap.m:

#import "MyMap.h" 

@interface MyMap() 

@end 

@implementation MyMap 

@end 

ViewController.m:

​​

結果:

2017年1月21日20:48:59.563 TestOC [4161:50263]保存値:1鍵に:とtestkey
2017年1月21日20:48:59.564 TestOC [4161:50263]保存した値: 1キーに:とtestkey

+0

ありがとう、私はこのような構造を変更することはできません。 – user2105624

+1

@ user2105624、この行は 'MyMap * usemap = [MyMap alloc];' MyMapインスタンスを初期化していませんでした。 'alloc'は単に記憶領域を割り当てます。 – aircraft

+0

私は混乱しています、他のものはうまく動作しています、私は正しく動作するNSMutableData *などがあります。 – user2105624

0

オブジェクトの内部設定は-initメソッドで行います。

@implementation MyMap 
@class MyClass; 
// NO NO NO! don't even ask what this does 
// NSMutableDictionary* mmap = [[NSMutableDictionary alloc] init]; 

// YES: Use -init to setup the initial state of an object. 
- (instancetype)init { 
    self = [super init]; 
    if (self != nil) { 
     // NOTE: _mmap is the instance variable for the property self.mmap. 
     _mmap = [[NSMutableDictionary alloc] init]; 
    } 
    return self; 
} 
@end 
関連する問題