我为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
答案 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
通常读/写。