1

我有从文件路径加载的 NSData。然后数据被传递,我需要数据来自哪里的文件路径。

除了将 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 回答