知識ポイント#3

3510 ワード

1、NSFileManager
/* 
 * 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];