1
A
回答
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
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 。
這是一個通用的解決方案,用於任何時候需要向現有類添加行爲(當然,遵循何時使用最佳類別的適當做法)。
相關問題
- 1. NSData的iPod庫路徑
- 2. 批處理文件讀取來自UNC路徑的INI文件
- 3. 來自NSData的CGPDFDocumentRef
- 4. 來自NSData的CString
- 5. 來自相對路徑的絕對路徑與不同的當前文件夾
- 6. 從文件名中提取文件名,路徑來自參數
- 7. 文件路徑路徑
- 8. 來自Swift的CGImageRef的NSData
- 9. 適當的文件路徑來讀取
- 10. Json的路徑來處理JSON文件
- 11. 來自遠程服務器的文件的完整路徑
- 12. 來自html和jsp的tomcat文件夾的路徑
- 13. 來自javafx中的目錄路徑的文件名
- 14. 來自NSDictionary的具有文件路徑的JSON字符串
- 15. 來自自定義路徑的SQLite
- 16. 來自[NSData dataWithContentsOfURL:]的NSString
- 17. 來自NSData信息的NSImage
- 18. 來自NSData的NSString爲空?
- 19. T4包含來自項目根目錄的文件路徑
- 20. xml來自變量的圖像文件路徑
- 21. C++ Boost文件系統:如何修改來自路徑的幹?
- 22. 來自文件路徑的Java輸入和輸出流
- 23. 來自Android資產的文件路徑未被識別
- 24. Silverlight忽略來自web.config文件的WCF路徑
- 25. PHP路徑 - 包括來自同一目錄的文件
- 26. VBA SaveCopyAs帶有來自變量的文件路徑
- 27. 來自ascx文件中相對路徑的絕對url?
- 28. Flash Builder忽略來自配置文件的庫路徑包含
- 29. Sphinx docs/RST包含來自動態路徑的文件?
- 30. 資產文件夾的路徑,來自RSpec測試
儘管這是一種有效的方式,並且很好地使用了新的關聯對象運行時調用,但我認爲只有在您真的需要時才應該這樣做,但這不是特別優雅。一個簡單的容器類,如@joerick所建議的,在這裏更合適,是封裝模型對象的更好方法,並且可以提供更易維護的代碼。 – 2012-04-22 23:01:01
@RobKeniger:好吧。 – user523234 2012-04-22 23:22:21