2017-01-21 2 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

오키! 고쳤다! : D 나는 self.mmap = [[NSMutableDictionary alloc] init];을 사용해야했습니다. alloc 후에 호출 된 void 함수 내에서. 자기가 없으면. 처음에는 효과가 없었습니다. – user2105624

답변

1

당신은 MyClass에 init 메소드를 오버라이드 (override)과 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 :

MyMap *usemap = [[MyMap alloc] init]; 
usemap.mmap = [[NSMutableDictionary 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); 

결과 :

,369 48 :

2017년 1월 21일 20 1,363,210 TestOC 59.563 [4161 : 50,263] 저장 값 1 키 : testkey
2017년 1월 21일 20 : 48 : 59.564 TestOC [4161 : 50,263] 저장된 값 : 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 
관련 문제