今天上班好死不死被我遇到物件互相參照的問題,也就是傳說中的A.h file中include B.h,同時B.h又includeA.h的問題,這實在是個經典不能再經典問題,剛好利用這個機會來搞清楚
1. 首先在互相include的問題中需要有個概念,就是其中一個物件是"擁有者",另外一個物件是"知道者",什麼意思?舉個粒子,假設有天養了一隻狗狗,那我就是狗狗的擁有者,而狗狗知道我。這就是互相include,好啦!C的解法可以參考intel開發人員專區,這裡要講的是Objective c的解法,其實概念很像,要先讓知道者知道擁有者的存在即可, 所以我們在知道者的.h file中使用
@class
這個關鍵字,@class能告訴知道者有這個class存在,也就是擁有者的存在,然後再到.m檔中include擁有者,就可以對擁有者進行存取的動作,再Objective c中可能會遇到需要知道AppDelegate的存在,在Objective c中我們可以使用
[NSApplication sharedApplication] // osx [UIApplication sharedApplication] // ios
來得到Application這個singleton,然後藉由
[NSApplication sharedApplication].delegate // osx [UIApplication sharedApplication].delegate // ios
來得到AppDelegate這個物件,所以在某物件中的.h就會使用@class關鍵字 *.h file
@class AppDelegate; @interface myObject : NSObject{ ... }
然後再去.m中import即可 *.m file
#import "AppDelegate.h" @implementation myObject ... @end
擁有者的部分就簡單喏!只要像平常一樣import即可XD
2. 最近的project需要檢查某資料夾大小有沒有過某個size,如果超過就要刪掉,保持在某個threshold之下,下面是一些上網找到好用的一些template
a. 檢查"資料夾"的大小(回傳byte):
- (unsigned long long int)folderSize:(NSString *)folderPath { NSArray *folderContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:folderPath error:nil]; __block unsigned long long int folderSize = 0; [folderContents enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSDictionary *fileAttributes = [[NSFileManager defaultManager] attributesOfItemAtPath:[folderPath stringByAppendingPathComponent:obj] error:nil]; folderSize += [[fileAttributes objectForKey:NSFileSize] intValue]; }]; NSString *folderSizeStr = [NSByteCountFormatter stringFromByteCount:folderSize countStyle:NSByteCountFormatterCountStyleFile]; NSLog(@"folder size = %@, number = %llu",folderSizeStr,folderSize); return folderSize; }
b. 檢查路徑下的資料夾是否存在,如果沒有存在就建立一個:
- (void)DirectoryExist{ NSFileManager *fileManager = [NSFileManager defaultManager]; NSString *dirPath = [NSString stringWithFormat:@"%@/Desktop/dir",NSHomeDirectory()]; if(![fileManager fileExistsAtPath:dirPath]){ [fileManager createDirectoryAtPath:dirPath withIntermediateDirectories:YES attributes:nil error:nil]; NSLog(@"create file success"); } }
c. 檢查某資料夾下特定"副檔名"的所有file:
NSMutableString *dirPath = [NSMutableString stringWithFormat:@"%@/Desktop/MySNG/video",NSHomeDirectory()]; NSLog(@"folder size = %lld",[self folderSize:dirPath]); NSArray* dirs = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:dirPath error:nil]; NSMutableArray *mp4Files = [[NSMutableArray alloc] init]; [dirs enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { NSString *filename = (NSString *)obj; NSString *extension = [[filename pathExtension] lowercaseString]; if ([extension isEqualToString:@"mp4"]) { [mp4Files addObject:[dirPath stringByAppendingPathComponent:filename]]; } }];
d. 刪除檔案:
[[NSFileManager defaultManager] removeItemAtPath:filePath error:nil];
沒有留言:
張貼留言