Obj-c, как мне создать функцию, которая будет заполнять NSDictionary и получать значение из функции? - PullRequest
1 голос
/ 17 января 2011

Я читал о NSArrays и NSDictionaires, и я думаю, что мне нужно позже.Я пытаюсь заполнить объект из небольшой таблицы базы данных.Так что я могу получить доступ к строковым значениям через идентификатор записи.Я должен сделать это несколько раз, поэтому имеет смысл поместить его в объект.

У меня есть основы ...

- (void)viewDidLoad {

// WORKING START
NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init];
[dictCategories setValue:@"Utility" forKey:@"3"];
[dictCategories setValue:@"Cash" forKey:@"5"];

NSString *result;
result = [dictCategories objectForKey:@"3"];

NSLog(@"Result=%@", result);
// WORKING END

   // Can't get this bit right, current error Request for member 
   // 'getCategories' in something not a structure or union
NSMutableDictionary *dictCategories2 = self.getCategories;

NSLog(@"Result2=%@", [dictCategories2 objectForKey:@"5"]);

[super viewDidLoad];
}

-(NSMutableDictionary*)getCategories {

NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init];

[dictCategories setValue:@"Utility" forKey:@"3"];
[dictCategories setValue:@"Cash" forKey:@"5"];

return dictCategories;

}

Ответы [ 2 ]

1 голос
/ 17 января 2011

вы вызываете метод неправильно, попробуйте [self getCategories]

0 голосов
/ 17 января 2011

Вы не понимаете, что не работает, но есть несколько вещей, которые явно неправильны (хотя JonLOo может быть замечен) ...

Во-первых. Вы используете неправильные методы, или, по крайней мере, есть лучший - setValue:forKey: должен / мог бы быть setObject:forKey:. Это может быть одной из причин вашей проблемы.

Во-вторых. Вы перерасходуете и не выпускаете должным образом. dictCategories2 в вашем viewDidLoad исчезнет в пустоте и принесет с собой выделенную память для dictCategories, определенную в методе getCategories. Простое стандартное исправление для этого - изменить

NSMutableDictionary *dictCategories = [[NSMutableDictionary alloc] init];

в getCategories в

NSMutableDictionary *dictCategories = [NSMutableDictionary dictionary];

Он будет автоматически выпущен системой последним способом.

В-третьих. Вы хотите прочитать о @property. Вместо getFoo, setBar, стандарт Ob-C должен использовать @properties для (предварительного) определения методов установки и методов получения. Затем вы можете переопределить их, чтобы при необходимости заполнить данные по умолчанию в ваших методах. Вы также (вероятно) хотите сохранить словарь в своем интерфейсе как переменную экземпляра, вместо того, чтобы постоянно освобождать его. Пример реализации @property, которая делает это:

@interface foo {
    NSMutableDictionary *ingredients;
}

@property (nonatomic, retain) NSMutableDictionary *ingredients;

@end

// ....

@implementation foo

@synthesize ingredients;

// ...

// the @synthesize command above will create getter and setter methods for us but 
// we can override them, which we need to do here

- (NSMutableDictionary *)ingredients
{
    if (ingredients != nil) {
        // we've already got an ingredients variable so we just return it
        return ingredients;
    }
    // we need to create ingredients
    ingredients = [[NSMutableDictionary alloc] init];
    [ingredients setObject:@"foo" forKey:@"bar"]
    return ingredients;
}

В методе viewDidLoad (или где-либо еще, где вы думаете, ingredients, возможно, еще не инициализирован), вы должны сделать, например,

NSMutableDictionary *dict = self.ingredients;

В любом другом месте вы можете использовать просто ingredients без self, но если оно равно nil, ваш метод никогда не будет вызван, и вы получите nil, брошенный в вас.

Это полезно во многих случаях и необходимо, если мы хотим когда-либо читать или записывать переменную ингредиентов вне нашего класса. Это вне того, о чем вы спрашиваете, но я поднял это, потому что вы пытаетесь сделать что-то похожее с self.getCategories.

Надеюсь, это поможет.

...