1

我为 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);

在这两种情况下,我都将 Contents 视为 null 问候,

尼拉夫

4

1 回答 1

1

覆盖一个类别中的现有方法是危险的,因为无法保证是否调用了覆盖的方法或已经存在的方法。特别是,NSDictionary已经有一个成员 call initWithContentsOfFile:。仅当您添加新方法 AFAIK 时,类别才是安全的。这同样适用于writeToFile:atomically:

要么创建一个子类(而不仅仅是添加一个类别),要么使用自定义字典类并使用组合。

有关详细信息,请参阅此答案

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

@interface NSDictionary (EncryptedReadingAndWriting)

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

@end

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

该解决方案的优点是,

  • 它不会破坏现有方法,无论如何这都是个坏主意,因为您不知道谁在使用这些方法以及出于什么目的,并且
  • 它非常清楚,这是一个新合同,它处理加密文件,而不是“通常”文件,NSDictionary通常是读/写。
于 2012-09-17T11:47:34.953 回答