NSMutableDictionary объекты не правильно доступны из методов?

Я создал NSMutableDictionary а также метод для добавления объектов в словарь. Я знаю, что функция addObject добавляет объекты в словарь правильно, но позже, когда я пытаюсь распечатать объекты с помощью метода Print_Objectкаждая переменная, принадлежащая объекту, печатается как null/0, Что-то не так с моим кодом?

-(NSMutableDictionary *)_stock{
    if (!_stock) {
        _stock = [[NSMutableDictionary alloc]init];
    }
    return _stock;  
}

-(void) addObject:(NSString*) desc key: (NSString*) theKey floatrc: (float) retailcost floatwsc: (float) wholesalecost intnoh: (int) numonhand floatns: (int) numsold {
    object_info* obj = [[object_info alloc]init];
    [obj setDescription: desc];
    [obj setRetailCost: retailcost];
    [obj setWholeSaleCost:wholesalecost];
    [obj setNumOnHand: numonhand];
    [obj setNumItemsSold: numsold];
    [self.stock setValue:obj forKey:theKey];   
}

-(void) Print_Object:(NSString *) theKey {
    object_info* obj = [self.stock objectForKey:theKey];
    NSLog(@"Key: %@ Description: %@ Retail Cost: %f Wholesale Cost: %f Number on Hand: %i Number Sold: %i", theKey, obj.description, obj.retail_cost, obj.wholesale_cost, obj.num_on_hand, obj.num_items_sold);     
}

Это объявление object_info:

#import "object_info.h"

@implementation object_info

//Getters
-(NSString *)description {
    return description;
}


-(float) retail_cost {
    return retail_cost;
}

-(float) wholesale_cost {
    return wholesale_cost;
}

-(int) num_on_hand {
    return num_on_hand;
}

-(int) num_items_sold {
    return num_items_sold;
}

//Setters
-(void)setDescription:(NSString *) value {
    description = value;
}

-(void) setRetailCost: (float) n {
    retail_cost = n;
}

-(void) setWholeSaleCost: (float) n {
    wholesale_cost = n;
}

-(void) setNumOnHand: (int) n {
    num_on_hand = n;
}

-(void) setNumItemsSold: (int) n {
    num_items_sold = n;
}

@end

Это object_info.h:

#import <Foundation/Foundation.h>

@interface object_info : NSObject
{
    NSString *description;
    float retail_cost;
    float wholesale_cost;
    int num_on_hand;
    int num_items_sold;
}

-(NSString *)description;
-(void)setDescription:(NSString *)value;

-(float) retail_cost;
-(void) setRetailCost:(float) n;

-(float) wholesale_cost;
-(void) setWholeSaleCost:(float) n;

-(int) num_on_hand;
-(void) setNumOnHand: (int) n;

-(int) num_items_sold;
-(void) setNumItemsSold:(int) n;

@end

2 ответа

Решение

Можете ли вы показать нам декларацию stock? Я подозреваю, что вы объявили это как @propertyв этом случае ваша попытка объявить -_stock поскольку добытчик будет неэффективным. Переменная экземпляра будет _stock но получатель будет просто -stock, Если это правильное предположение, то если бы вы NSLog(@"%@", self.stock) Тебе следует увидеть (null) в качестве вывода - ваш пользовательский геттер не вызывается, поэтому словарь никогда не создается.

Ваш код обычно выглядит очень старомодным; особенно:

  1. Вы почти никогда не помещаете хранилище экземпляров в @interface сейчас; положить его в @implementation;
  2. весь ваш object_info может быть переформулирован как @propertyс, и тогда вам не нужно реализовывать вещь внутри этого @implementationпросто дайте свойствам автоматически синтезироваться;
  3. скорее, чем [obj setDescription: desc];и т. д., теперь вы обычно видите использование синтаксиса точек, например obj.description = desc;, Компилятор по-прежнему будет гарантировать, что вызывается правильный установщик (или получатель), это всего лишь формулировка, которая требует меньше ментального контекста, позволяя читать слева направо;
  4. более нормальный современный способ доступа к словарю dictionary[key] = value хранить и dictionary[key] для доступа.
  [self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400];
  [self Print_Object:@"BBB"];

Это прекрасно работает для меня, вы используете неправильный ключ?

  [self addObject:@"AAA" key:@"BBB" floatrc:100 floatwsc:200 intnoh:300 floatns:400];
  [self Print_Object:@"AAA"];

Это идет не так, потому что объект равен нулю.

  2017-02-16 10:48:34.086 Test[53298:14250944] Key: AAA Description: (null) Retail Cost: 0.000000 Wholesale Cost: 0.000000 Number on Hand: 0 Number Sold: 0
Другие вопросы по тегам