Я, кажется, поразил простой вопрос, который я не могу понять. Как показано на рисунке, у меня есть объект NSOperation
, который создается, и я пытаюсь установить его на NSMutableDictionary
, который вместо «0» NSOperation
устанавливает «null» вместо ключа.Устранение неполадок при установке объекта NSOperation в NSMutableDictionary
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. Вы компилируете это в конфигурации отладки? 2. Подходит ли 'CSStatisticsKey' к' NSCoding' и неизменен? – StatusReport
Да компилируется в debug config, но я думаю, что это не должно меняться. Для целей тестирования я заменил установку на рабочий объект и попытался установить @ «Привет», который всегда работает, как и ожидалось, но объект операции этого не делает. Класс CSStatisticsKey соответствует протоколу NSCodying и NSCopying. Я отправил код класса выше, пожалуйста, проверьте. –
Несвязанный, но 'CSStatisticsKey * theDelegate = [[CSStatisticsKey alloc] init];' не нужно делать. Объект уже выделен. Просто вызовите '[self set ...]' методы и верните 'self' объект. – Mar0ux