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

そして、ファイルの1つでそれらを次のように使用します

#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すでにメンバー コールがありますinitWithContentsOfFile:。カテゴリは、新しいメソッドを追加した場合にのみ安全です。についても同様writeToFile:atomically:です。

(単にカテゴリを追加するのではなく) サブクラスを作成するか、カスタム ディクショナリ クラスを使用して構成を採用します。

詳細については、この回答を参照してください。

既存のメソッドをフックする代わりに、その目的のために独自の特定のメソッド ペアを追加することの何が問題なのか?

@interface NSDictionary (EncryptedReadingAndWriting)

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

@end

メソッドは「標準」のメソッドと十分に似ているため、使用方法が明確になるはずです (ただし、少しコメントを追加しても問題はありません)。

このソリューションには利点があります。

  • 既存のメソッドを壊すことはありませんが、これはとにかく悪い考えです。なぜなら、誰がそれらを何の目的で使用しているのかがわからないからです。
  • これは、「通常の」ファイルではなく、NSDictionary通常は読み取り/書き込みである暗号化されたファイルを扱う新しい契約であることを完全に明確にしています。
于 2012-09-17T11:47:34.953 に答える