知識ポイント#3
3510 ワード
1、NSFileManager
2、iOSデバイスの唯一の識別
第一反応はもちろんUUIDですが、単純にUUIDを使う過程で問題が発生します.
注意:
1.同じデバイスで動作し、同じベンダーからのすべてのAppについて、この値は同じです.2、1つのデバイス上で異なるサプライヤーからのappに対して、この値は異なる.異なるデバイスのappは、ベンダーが同じかどうかにかかわらず、この値が異なります.3、この値が空の場合は、後で取得します.ユーザーがデバイスをロックした後、デバイスを再起動します.このとき取得が空で、ロックを解除する必要があります.4.この値は、同じ仕入先からの異なるAppをデバイスにインストールした場合、変更されません.あるベンダーからのすべてのappを削除して再インストールすると、この値が変わります.
特に4つ目(Appを削除するたびに再取得されるUUIDは異なります)は、iOSデバイスの一意の識別としてUUIDを簡単に使用することはできません.
解決策:一度取得した後、キー列を使用して保存すると、Appを削除して再インストールしてもBundleIdだけが変わらず、キー列から取得したUUIDは変わりません.
具体的な実装は、iOS Keychainの理解を参照してください.
3、複製
非アセンブリオブジェクトとのペア
集合オブジェクト
NSKeydUnarchiverとNSKeydArchiverの統合
/*
* static ,
* static , ,
*/
static NSString* _cacheDirectory;
/*
* inline , , , inline ,
* inline , , call , ,
* , , for ,
*/
static inline NSString* CacheDirectory() {
if(! _cacheDirectory) {
NSString* cachesDirectory = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) objectAtIndex:0];
_cacheDirectory = [[cachesDirectory stringByAppendingPathComponent:@"Cache"] copy];
if (![[NSFileManager defaultManager] fileExistsAtPath: _cacheDirectory]) {
[[NSFileManager defaultManager] createDirectoryAtPath: _cacheDirectory withIntermediateDirectories:YES attributes:nil error:nil];
}
}
return _CacheDirectory;
}
- (void)fileDirectory
{
/* Cache
* iOS
* fileA
* fileB
* Android
* fileC
* programA
* programB
*/
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error = nil;
// contentsOfDirectoryAtPath: error: ( )
NSArray *directoryList = [fileManager contentsOfDirectoryAtPath:CacheDirectory() error:&error];
for (NSString *directoryName in directoryList) {
NSLog(@"directoryName = %@",directoryName); // iOS Android
NSString *directoryPath = [CacheDirectory() stringByAppendingPathComponent:directoryName];
// enumeratorAtPath: ,
NSDirectoryEnumerator *enumerators = [fileManager enumeratorAtPath:directoryPath];
for (NSString *path in enumerators) {
NSLog(@"path = %@",path); // fileA fileB fileC fileC/programA fileC/programB
}
}
}
2、iOSデバイスの唯一の識別
第一反応はもちろんUUIDですが、単純にUUIDを使う過程で問題が発生します.
// UUID
[[[UIDevice currentDevice] identifierForVendor] UUIDString];
注意:
1.同じデバイスで動作し、同じベンダーからのすべてのAppについて、この値は同じです.2、1つのデバイス上で異なるサプライヤーからのappに対して、この値は異なる.異なるデバイスのappは、ベンダーが同じかどうかにかかわらず、この値が異なります.3、この値が空の場合は、後で取得します.ユーザーがデバイスをロックした後、デバイスを再起動します.このとき取得が空で、ロックを解除する必要があります.4.この値は、同じ仕入先からの異なるAppをデバイスにインストールした場合、変更されません.あるベンダーからのすべてのappを削除して再インストールすると、この値が変わります.
特に4つ目(Appを削除するたびに再取得されるUUIDは異なります)は、iOSデバイスの一意の識別としてUUIDを簡単に使用することはできません.
解決策:一度取得した後、キー列を使用して保存すると、Appを削除して再インストールしてもBundleIdだけが変わらず、キー列から取得したUUIDは変わりません.
具体的な実装は、iOS Keychainの理解を参照してください.
3、複製
非アセンブリオブジェクトとのペア
NSMutableString *string_m = [NSMutableString stringWithFormat:@"ONCE"];
NSString *string = [string_m copy];
集合オブジェクト
// copyItems YES ,
NSDictionary *dict_c = @{@"title":@"once"};
NSDictionary *dict = [[NSDictionary alloc] initWithDictionary:dict_c copyItems:YES];
NSKeydUnarchiverとNSKeydArchiverの統合
// , ( , NSCoding )
- (id)deepCopy {
id obj = nil;
@try {
obj = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:self]];
}
@catch (NSException *exception) {
NSLog(@"%@", exception);
}
return obj;
}
// , NSCoding ,
Archiver *archiver = [[Archiver alloc] init];
[archiver deepCopy];