NSDictionary类别失败

时间:2012-09-17 09:49:35

标签: objective-c nsdictionary

我为NSDictionary创建了一个类别并覆盖了几个方法 1. writeToFile 2. initWithContentsOfFile。

WriteToFile函数完美运行,我的函数被调用。 initWithContentsOfFile失败,它不会调用我的扩展函数,它返回NULL。

任何指针/解决方案/指导我错过或做错了什么?

同样的事情适用于NSString,我可以调用类似的方法。

更新 - 我的代码

#import <Foundation/Foundation.h>

@interface NSDictionary (TESTDictionary)

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;
-(id)initWithContentsOfFile:(NSString *)path;

@end

实施

 #import "NSDictionary+TESTDictionary.h"
@implementation NSDictionary (DMPNSDictionary)

-(BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile{

    NSData *someData ;
    //
    //I process somedata and convert the NSDictionary to NSData here
    //
    //Write the processed data
    return [someData writeToFile:path atomically:useAuxiliaryFile];
}

-(id)initWithContentsOfFile:(NSString *)path{
    //Read the file to NSData
    NSData *someData = [read from the file here];
    //convert the NSData to NSDictionary
    self = convertedNSDictionary;
    return self;
}

@end

我在其中一个文件中使用它们

#import "NSDictionary+TESTDictionary.h"

NSDictionary *xmlDictionary;
//write to file where storepath is in application document directory
[xmlDictionary writeToFile:storePath atomically:YES];

我尝试阅读如下

 NSMutableDictionary *xmlDictionary = [[NSMutableDictionary alloc]initWithContentsOfFile:storePath1];
    NSLog(@"Contents ::%@",xmlDictionary);

 NSDictionary *xmlDictionary = [[NSDictionary alloc]initWithContentsOfFile:storePath1];
    NSLog(@"Contents ::%@",xmlDictionary);

在这两种情况下,我都将内容视为空 的问候,

Nirav

1 个答案:

答案 0 :(得分:1)

覆盖类别中的现有方法是危险的,因为无法保证是否调用了重写方法或现有方法。特别是,NSDictionary已有成员通话initWithContentsOfFile:。如果添加新方法AFAIK,则类别是安全的。这同样适用于writeToFile:atomically:

创建子类(而不是仅添加类别),或使用自定义词典类并使用合成。

有关详细信息,请参阅this answer

修订为此目的添加您自己的特定方法对而不是挂钩现有方法有什么问题?

@interface NSDictionary (EncryptedReadingAndWriting)

- (id) initWithContentsOfEncryptedFile: (NSString*) path;
- (BOOL) writeToEncryptedFile: (NSString*) path atomically: (BOOL) flag;

@end

这些方法与“标准”方法类似,因此应该清楚如何使用它们(尽管添加一些注释不会有害)。

此解决方案具有以下优点:

  • 它并没有破坏现有的方法,无论如何这都是一个坏主意,因为你不知道谁在使用它们以及用于何种目的,
  • 它绝对清楚,这是一个新的合同,它处理加密文件,而不是“通常”文件,NSDictionary通常读/写。