2013-07-08 1 views
0

Я, кажется, поразил простой вопрос, который я не могу понять. Как показано на рисунке, у меня есть объект NSOperation, который создается, и я пытаюсь установить его на NSMutableDictionary, который вместо «0» NSOperation устанавливает «null» вместо ключа.Устранение неполадок при установке объекта NSOperation в NSMutableDictionary

enter image description here

The keyToOperationDictionary создан отложенной загрузки, вот код:

@synthesize keyToOperationDictionary = keyToOperationDictionary_; 
-(NSMutableDictionary*)keyToOperationDictionary 
{ 
    if (nil==keyToOperationDictionary_) 
    { 
     keyToOperationDictionary_ = [[NSMutableDictionary alloc] init]; 
    } 
    return keyToOperationDictionary_; 
} 

Я не знаю, что еще происходит здесь не так. Когда я печатаю объект в консоли отладки, он показывает мне объект, но тот же объект не установлен в словаре.

Любая помощь/предложения окажут большую помощь!

PS: Я забыл упомянуть ранее, что он работает иногда, а иногда и нет. Я понятия не имею, почему!

Добавлены подробности:

CSStatisticsKey class:

Интерфейс:

#import <Foundation/Foundation.h> 
#import "CSDateRange.h" 
#import "CSStatisticsManager.h" 
#import "CSStatisticsManagerDelegateProtocol.h" 

@interface CSStatisticsKey : NSObject <NSCopying, NSCoding> 
@property (nonatomic, strong, readonly) CSDateRange *dateRange; 
@property (nonatomic, strong, readonly) NSString *statisticsDelegatePointer; 

// Designated initializer 
-(id)initWithDateRange:(CSDateRange*)inDateRange statisticsDelegate:(id<CSStatisticsManagerDelegateProtocol>)inStatisticsDelegate; 

@end 

Реализация:

@interface CSStatisticsKey() 
@property (nonatomic, strong) CSDateRange *dateRange; 
@property (nonatomic, strong) NSString *statisticsDelegatePointer; 
@end 

@implementation CSStatisticsKey 

- (id)init 
{ 
    return [self initWithDateRange:nil 
       statisticsDelegate:nil]; 
} 

-(id)initWithDateRange:(CSDateRange*)inDateRange statisticsDelegate:(id<CSStatisticsManagerDelegateProtocol>)inStatisticsDelegate 
{ 
    self = [super init]; 
    if (self) 
    { 
     [self setDateRange:inDateRange]; 
     [self setStatisticsDelegatePointer:[NSString stringWithFormat:@"%x", inStatisticsDelegate]]; 
    } 
    return self; 
} 

#pragma mark - NSCopying 
- (id)copyWithZone:(NSZone *)zone 
{ 
    return [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:self]]; 
} 

#pragma mark - NSCoding 
- (void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    [aCoder encodeObject:self.dateRange forKey:@"TheDateRange"]; 
    [aCoder encodeObject:self.statisticsDelegatePointer forKey:@"TheStatsDelegateValue"]; 
} 

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    CSDateRange *dRange =[aDecoder decodeObjectForKey:@"TheDateRange"]; 
    NSString *dValue = [aDecoder decodeObjectForKey:@"TheStatsDelegateValue"]; 
    CSStatisticsKey *theDelegate = [[CSStatisticsKey alloc] init]; 
    [theDelegate setStatisticsDelegatePointer:dValue]; 
    [theDelegate setDateRange:dRange]; 
    return theDelegate; 
} 

#pragma mark - Equality 
-(BOOL)isEqual:(id)object 
{ 
    BOOL delegatesAreEqual = NO; 

    if ([object isKindOfClass:[CSStatisticsKey class]]) 
    { 
     CSStatisticsKey *statsDelegate = (CSStatisticsKey*)object; 
     if ([self.dateRange isEqual:statsDelegate.dateRange] && [self.statisticsDelegatePointer isEqual:statsDelegate.statisticsDelegatePointer]) 
     { 
      delegatesAreEqual = YES; 
     } 
    } 
    return delegatesAreEqual; 
} 

#pragma mark - Description 
-(NSString*)description 
{ 
    return [NSString stringWithFormat:@"%@ %@-%@", self.statisticsDelegatePointer, self.dateRange.fromDate, self.dateRange.toDate]; 
} 
@end 
+1

1. Вы компилируете это в конфигурации отладки? 2. Подходит ли 'CSStatisticsKey' к' NSCoding' и неизменен? – StatusReport

+0

Да компилируется в debug config, но я думаю, что это не должно меняться. Для целей тестирования я заменил установку на рабочий объект и попытался установить @ «Привет», который всегда работает, как и ожидалось, но объект операции этого не делает. Класс CSStatisticsKey соответствует протоколу NSCodying и NSCopying. Я отправил код класса выше, пожалуйста, проверьте. –

+1

Несвязанный, но 'CSStatisticsKey * theDelegate = [[CSStatisticsKey alloc] init];' не нужно делать. Объект уже выделен. Просто вызовите '[self set ...]' методы и верните 'self' объект. – Mar0ux

ответ

0

Кажется, есть некоторые проблемы с отладчиком lldb. В то же точки останова, где показано выше, когда я бегу следующие команды, я получаю следующий результат:

(lldb) po self.keyToOperationDictionary 
$1 = 0x144647b0 { 
    "a4779e0 2013-07-01 00:00:00 +0000-2013-07-31 00:00:00 +0000" = (null); 
    "a4779e0 0003-11-01 00:00:00 +0000-0003-11-30 00:00:00 +0000" = "<CSStatisticsOperation: 0x14464d20>"; 
} 
(lldb) po theKey 
$2 = 0x0a5270a0 a4779e0 2013-07-01 00:00:00 +0000-2013-07-31 00:00:00 +0000 
(lldb) po [self.keyToOperationDictionary objectForKey:theKey] 
$3 = 0x14168c30 <CSStatisticsOperation: 0x14168c30> 
(lldb) 

Довольно ясно, что есть что-то не так с отладчиком и, следовательно, словарь не печатает объект операции.

 Смежные вопросы

  • Нет связанных вопросов^_^