我有NSData,我从filePath加载。然后传递数据,我需要filePath来获取数据的来源。
除了将filePath作为额外参数传递之外,最简单的方法是什么?
答案 0 :(得分: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
答案 1 :(得分:2)
虽然您应该创建一个包含所需数据的单独结构或类,但您也可以向NSData添加关联。
为方便起见,您甚至可以将其作为NSData上的类别进行...假设您正在使用字符串...如果使用URL,则使用NSURL ...这样,您的其他代码都不需要更改...您仍然可以像以前一样使用新添加的属性。
注意:使用或不使用类别的原因有很多。我假设您将为您的代码情况做出最佳选择,并将战争推迟到其他人的好/坏使用。
尝试这样的事情......
的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。
这是您需要向现有类添加行为的一般解决方案(当然,遵循何时最佳使用类别的适当做法)。