六.Foundation框架中常用类的介绍续


在家疯狂的玩了10天,迎来了一个崭新的农历兔年。终于熬过了自己的本命年了,过去的不顺心都忘却吧,享受自己新的一年的生活吧!虽说在家待了差不多2周,还是没有尽兴,也可能是因为大年初三就要来上班的缘故吧!在家里总觉得和朋友有说不完的话,总想着能再和家人待上一天。这也造成了初三上班的时候,到下午才到,结果被主管批了一顿,虽说是自己不对,但是总觉得这里的主管没有什么人情味。哎,不说了,大过年的影响心情。在这里祝csdn中的所有网友们,新年快乐!以下省略若干字,请各位网友自行补充。以满足各位不管是心理,还是生理的需要。闲话不多了,言归正传!

    去年发表的新帖子,现在才有序实属惭愧。文件操作不管是语言和框架都是一个重点部分。下面我们就来看下foundation中文件操作的一些常用的类的用法。

    首先来看下一个操作文件以及目录的重要类NSFileManager。下面还是看一段代码,来一一说明此类的用法

    NSFileManager *fm;
    NSDirectoryEnumerator *dirEnum;
    NSArray *dirArray;
     // 需要创建一个file manager的实例
    fm = [NSFileManager defaultManager];
    
    // 获取当前工作目录的路径
    path = [fm currentDirectoryPath];
    
    // 遍历这个目录
    dirEnum = [fm enumeratorAtPath: path];

    NSLog(@"Contents of %@:", path);

    while ((path = [dirEnum nextObject]) != nil)

    {
            
            NSLog(@"%@", path);

    }

    // 另一种遍历目录的方法
    
    dirArray = [fm contentsOfDirectoryAtPath: [fm currentDirectoryPath] error: nil];

    NSLog(@"Contents using contentsOfDirectoryAtPath:");

    for (path in dirArray)

        NSLog(@"%@", path);

相信仔细看了这些代码之后,会对NSFileManager这个类如何遍历目录,有了一定的认识吧。其实这些代码都非常简单,只要查看apple developer文档都能找到的。虽说理解起来简单,但是有时候一动手写代码还是会遇到很多问题的。例如下面

        NSArray *aryProvsioning = [FileManager contentsOfDirectoryAtPath:@"/vault/provisioning" error:nil];
        for(NSString* provisioningFile in aryProvsioning)
        {
            NSLog(@"delete file:%@",provisioningFile);
            [FileManager removeItemAtPath:[NSString stringWithFormat:@"/vault/provisioning/%@",provisioningFile]
                                    error:nil];
        }

这段代码的功能是删除/vault/provisioning下的所有文件,有兴趣的可以亲自实验以下,确实可以删除该文件夹下面的所有文件。但是有种情况不行,就是该文件夹下又存在文件夹的情况下,该方法removeitemAtPath就不能删除,也就是该方法只能删除文件不能删除目录,所以在用的时候要格外小心,一定要认真阅读开发文档。所以上面如果想要删除该文件夹下面的所有文件及目录,就要写成函数来递归调用。

void deleteAllAtPath(NSString *path)

{

        NSArray *aryProvsioning = [FileManager contentsOfDirectoryAtPath:path error:nil];

        if (aryProvsioning == nil)

            return;
        for(NSString* provisioningFile in aryProvsioning)
        {
            deleteAllAtPath(provisioningFile);

            NSLog(@"delete file:%@",provisioningFile);
            [FileManager removeItemAtPath:[NSString stringWithFormat:@"/vault/provisioning/%@",provisioningFile]
                                    error:nil];
        }

}

下面再来看一个读写文件的类NSFileHandle,其实它的实现就是调用c语言种文件流的操作。通过取得文件流的指针,然后定位指针的位置从而读取出文件中的内容,同样在文件中写入东西也是同样的道理,下面来看一小短代码。

    NSFileHandle *TXTFileHandle;

    NSString    *szTXTFileTemp = @"111.txt";
    TXTFileHandle = [NSFileHandle fileHandleForWritingAtPath:szTXTFileTemp];

    //防止该文件不存在,如果不存在,新建该文件并写入空数据。
    if(!TXTFileHandle)
    {
        [@"" writeToFile:szTXTFileTemp atomically:NO encoding:1 error:nil];
        TXTFileHandle = [NSFileHandle fileHandleForWritingAtPath:szTXTFileTemp];
    }

    [TXTFileHandle seekToEndOfFile];

    char * conTemp = "mengtnt";

    [TXTFileHandle  writeData:[NSData dataWithBytes:conTemp length:8];

    [TXTFileHandle closeFile];

    //下面是读取

    TXTFileHandle = [NSFileHandle fileHandleForReadingAtPath:szTXTFileTemp];

    NSData *fileData = [TXTFileHandle readDataToEndOfFile];

    NSlog(@"%@",[[NSString alloc] initWithData:fileData  encoding:NSUTF8StringEncoding]);

    [TXTFileHandle closeFile];

  以上就是cocoa编程中文件操作的常见用法,下面再看两个类,虽说里面的方法都很简单,但是不注意一些细节还是会出问题的。

    NSThread类,开启一个线程的方法在简单不过了,[NSThread detachNewThreadSelector:@selector(StartThreadTest:) toTarget:self withObject:nil];其中selector就是你要调用的线程方法。


- (void)StartThreadTest:(id)idThread
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    //一些UI事件以及其他事件处理
    [pool release];
}

不知道大家注意了没有,为什么线程中要加release pool那。特别是线程中有处理UI事件的时候一定要加上pool,否则你会发现应用程序运行异常的慢,甚至有的时候会crash掉。可能是线程的资源在使用时,很难判断何时使用完毕,所以编译器也就不方便自动释放这些资源,这样就要手动加上pool,使线程运行到此处的时候释放掉某些资源。究其深层的原因,自己也是一知半解。这里仅仅是自己的一些想法,还望那位高手能指点下分析的是否正确。

    最后跟大家提以下NSTimer的用法,NSTimer说白了就是一个定时器,就是用来每隔一段时间运行某段代码

[NSTimer scheduledTimerWithTimeInterval:0.2
target:self
selector:@selector(DetectSN:)
userInfo:nil
repeats:YES];

当你相停止timer的时候就调用invalide方法。需要注意的一点是当NSTimer被设置无效的时候,要想使用这个timer对象,必须重新开辟一个NSTimer的对象。

那么关于NSFoundation一些类的用法就先介绍到这里吧,这些都是自己平时整理一些资料,这些类都是比较容易用到,同时也容易出错的类。希望能给大家一些帮助,同时在调试中也提高了自己的能力。以后我就来简单的分享下自己cocoa编程中ApplicationKit框架的一些简单用法,不过我一直在UI设计方面存在先天不足,也希望在介绍ApplicationKit框架,各位老鸟看到我设计的一些UI的时候,能给点建设性的意见,以让自己摆脱这方面的苦恼。

原文链接

如果你喜欢这篇文章,谢谢你的赞赏

图3

如有疑问请联系我