Вы не понимаете, что не работает, но есть несколько вещей, которые явно неправильны (хотя 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
.
Надеюсь, это поможет.