iOS开发基础知识--碎片16
1:Objective-C语法之动态类型
(isKindOfClass, isMemberOfClass,id)
对象在运行时获取其类型的能力称为内省。内省可以有多种方法实现。 判断对象类型 -(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例 -(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例 实例一: Person *person = [[Person alloc] init]; //父类 Teacher *teacher = [[Teacher alloc] init]; //子类 //YES if ([teacher isMemberOfClass:[Teacher class]]) { NSLog(@"teacher Teacher类的成员"); } //NO if ([teacher isMemberOfClass:[Person class]]) { NSLog(@"teacher Person类的成员"); } //NO if ([teacher isMemberOfClass:[NSObject class]]) { NSLog(@"teacher NSObject类的成员"); } 实例二: Person *person = [[Person alloc] init]; Teacher *teacher = [[Teacher alloc] init]; //YES if ([teacher isKindOfClass:[Teacher class]]) { NSLog(@"teacher 是 Teacher类或Teacher的子类"); } //YES if ([teacher isKindOfClass:[Person class]]) { NSLog(@"teacher 是 Person类或Person的子类"); } //YES if ([teacher isKindOfClass:[NSObject class]]) { NSLog(@"teacher 是 NSObject类或NSObject的子类"); } isMemberOfClass判断是否是属于这类的实例,是否跟父类有关系他不管,所以isMemberOfClass指到父类时才会为NO; 对方法进行判断: -(BOOL) respondsToSelector: selector 判读实例是否有这样方法 +(BOOL) instancesRespondToSelector: 判断类是否有这个方法。此方法是类方法,不能用在类的对象 实例三: // YES teacher是对象 if ( [teacher respondsToSelector: @selector( setName: )] == YES ) { NSLog(@"teacher responds to setSize: method" ); } // YES Teacher是类 if ( [Teacher instancesRespondToSelector: @selector(teach)] == YES ) { NSLog(@"Teacher instance responds to teach method"); }
2:IOS 开发中判断字符串是否为空字符的方法
- (BOOL) isBlankString:(NSString *)string { if (string == nil || string == NULL) { return YES; } if ([string isKindOfClass:[NSNull class]]) { return YES; } if ([[string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]] length]==0) { return YES; } return NO; }
3:删除Caches文件夹的内容
// 文件管理者 NSFileManager *mgr = [NSFileManager defaultManager]; // 缓存路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; [mgr removeItemAtPath:caches error:nil];
4:计算某个文件夹或文件的大小
/** * @ 15-06-17 09:06:22 * * @brief 计算文件或文件夹的大小 因为osx 文件夹是没有大小这个属性 要通过各个文件计算得到 subpathsAtPath可以获得文件夹下面所有的文件 包含子文件夹里面 * @param filePath 比如缓存caches的路径 * @return 大小 */ - (NSInteger)fileSize:(NSString *)filePath { NSFileManager *mgr = [NSFileManager defaultManager]; // 判断是否为文件 BOOL dir = NO; BOOL exists = [mgr fileExistsAtPath:filePath isDirectory:&dir]; // 文件文件夹不存在 if (exists == NO) return 0; if (dir) { // self是一个文件夹 // 遍历caches里面的所有内容 --- 直接和间接内容 NSArray *subpaths = [mgr subpathsAtPath:filePath]; NSInteger totalByteSize = 0; for (NSString *subpath in subpaths) { // 获得全路径 NSString *fullSubpath = [filePath stringByAppendingPathComponent:subpath]; // 判断是否为文件 BOOL dir = NO; [mgr fileExistsAtPath:fullSubpath isDirectory:&dir]; if (dir == NO) { // 文件 totalByteSize += [[mgr attributesOfItemAtPath:fullSubpath error:nil][NSFileSize] integerValue]; } } return totalByteSize; } else { // 是一个文件 return [[mgr attributesOfItemAtPath:filePath error:nil][NSFileSize] integerValue]; } } 调用传入下面的路径: NSFileManager *mgr = [NSFileManager defaultManager]; // 缓存路径 NSString *caches = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
5:文件操作(NSFileManager)iOS (转)
iOS的沙盒机制,应用只能访问自己应用目录下的文件。iOS不像android,没有SD 卡概念,不能直接访问图像、视频等内容。iOS应用产生的内容,如图像、文件、缓存内容等都必须存储在自己的沙盒内。默认情况下,每个沙盒含有3个文件 夹:Documents, Library 和 tmp。Library包含Caches、Preferences目录。 Documents:苹果建议将程序创建产生的文件以及应用浏览产生的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录 Library:存储程序的默认设置或其它状态信息; Library/Caches:存放缓存文件,保存应用的持久化数据,用于应用升级或者应用关闭后的数据保存,不会被itunes同步,所以为了减少同步的时间,可以考虑将一些比较大的文件而又不需要备份的文件放到这个目录下。 tmp:提供一个即时创建临时文件的地方,但不需要持久化,在应用关闭后,该目录下的数据将删除,也可能系统在程序不运行的时候清除。 a:获取应用沙盒根路径: -(void)dirHome{ NSString *dirHome=NSHomeDirectory(); NSLog(@"app_home: %@",dirHome); } b:获取Documents目录路径: -(NSString *)dirDoc{ //[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSLog(@"app_home_doc: %@",documentsDirectory); return documentsDirectory; } c:获取Library目录路径: -(void)dirLib{ //[NSHomeDirectory() stringByAppendingPathComponent:@"Library"]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *libraryDirectory = [paths objectAtIndex:0]; NSLog(@"app_home_lib: %@",libraryDirectory); } d:获取Cache目录路径: -(void)dirCache{ NSArray *cacPath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); NSString *cachePath = [cacPath objectAtIndex:0]; NSLog(@"app_home_lib_cache: %@",cachePath); } e:获取Tmp目录路径: -(void)dirTmp{ //[NSHomeDirectory() stringByAppendingPathComponent:@"tmp"]; NSString *tmpDirectory = NSTemporaryDirectory(); NSLog(@"app_home_tmp: %@",tmpDirectory); } f:创建文件夹: -(void *)createDir{ NSString *documentsPath =[self dirDoc]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; // 创建目录 BOOL res=[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil]; if (res) { NSLog(@"文件夹创建成功"); }else NSLog(@"文件夹创建失败"); } g:创建文件 -(void *)createFile{ NSString *documentsPath =[self dirDoc]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"]; BOOL res=[fileManager createFileAtPath:testPath contents:nil attributes:nil]; if (res) { NSLog(@"文件创建成功: %@" ,testPath); }else NSLog(@"文件创建失败"); } h:写数据到文件: -(void)writeFile{ NSString *documentsPath =[self dirDoc]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"]; NSString *content=@"测试写入内容!"; BOOL res=[content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil]; if (res) { NSLog(@"文件写入成功"); }else NSLog(@"文件写入失败"); } i:读文件数据: -(void)readFile{ NSString *documentsPath =[self dirDoc]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"]; // NSData *data = [NSData dataWithContentsOfFile:testPath]; // NSLog(@"文件读取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]); NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil]; NSLog(@"文件读取成功: %@",content); } j:文件属性: -(void)fileAttriutes{ NSString *documentsPath =[self dirDoc]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"]; NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:testPath error:nil]; NSArray *keys; id key, value; keys = [fileAttributes allKeys]; int count = [keys count]; for (int i = 0; i < count; i++) { key = [keys objectAtIndex: i]; value = [fileAttributes objectForKey: key]; NSLog (@"Key: %@ for value: %@", key, value); } } k:删除文件: -(void)deleteFile{ NSString *documentsPath =[self dirDoc]; NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"]; NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"]; BOOL res=[fileManager removeItemAtPath:testPath error:nil]; if (res) { NSLog(@"文件删除成功"); }else NSLog(@"文件删除失败"); NSLog(@"文件是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO"); }