1

filePathからロードしているNSDataがあります。その後、データが渡され、データの送信元のfilePathが必要になります。

filePathを追加のパラメーターとして渡す以外に、これを行う最も簡単な方法は何ですか?

4

2 に答える 2

5

ファイルを表すコンテナオブジェクトで両方をラップします。例:

@interface File : NSObject

@property (strong) NSData *fileContents;
@property (copy) NSString *filePath;

// perhaps, even a nice constructor to fill these properties
- (id)initWithFilePath:(NSString *)filePath;

@end
于 2012-04-22T22:22:19.360 に答える
2

おそらく、必要なデータを含む別の構造体またはクラスを作成する必要がありますが、NSData への関連付けを追加することもできます。

便宜上、NSData のカテゴリとしてそれを行うこともできます...文字列を使用していると仮定して...URL を使用している場合は NSURL を使用します...そのように、他のコードを変更する必要はありません...あなたはまだできます新しく追加されたプロパティを使用して、以前と同じように NSData を使用します。

注: カテゴリを使用する、または使用しない理由はたくさんあります。コードの状況に最適な選択を行い、カテゴリの良い/悪い使用に関する戦争を他の人に任せると思います。

このようなものを試してみてください...

NSData+AssociatedFilePath.h

#import <Foundation/Foundation.h>

@interface NSData (AssociatedFilePath)
@property (nonatomic, strong) NSString *filePath;
@end

NSData+AssociatedFilePath.m

#import <objc/runtime.h>

static char kFilePath;

@implementation NSData (AssociatedFilePath)

- (void)setFilePath:(NSString*)filePath
{
    objc_setAssociatedObject(self, &kFilePath, filePath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}

- (NSString*)filePath
{
  return objc_getAssociatedObject(self, &kFilePath);
}

@end

今、あなたのコードでこれを行うことができます...

NSData *data = // whatever you do to create the data object..
data.filePath = someFilePath;

NSData オブジェクトのファイル パスが必要な場合はいつでも...

NSString *filePath = myNSDataObject.filePath;

これはカテゴリであるため、任意の NSData オブジェクトでこれを使用できます。ファイル パスが設定されていない場合は、nil が返されます。

これは、既存のクラスに動作を追加する必要がある場合の一般的な解決策です (もちろん、カテゴリを最適に使用する適切な方法に従います)。

于 2012-04-22T22:41:11.813 に答える