Foundation框架中常用类的介绍(小结2)

来源:互联网 发布:python删除excel数据 编辑:程序博客网 时间:2024/05/18 00:32

NSArray的一个特殊的用法,就是在数组中放置dictionary的时候,数组同样可以用valueForKey的方法来访问dictionary中的value。代码演示如下:

    NSDictionary *dic1 = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"sky",nil];
    NSDictionary *dic2 = [NSDictionary dictionaryWithObjectsAndKeys:@"2",@"zhiwei",nil];

    NSDictionary *dic3 = [NSDictionary dictionaryWithObjectsAndKeys:@"1",@"mengtnt",nil];
    NSMutableArray *ary = [[NSMutableArray alloc] init];
    [ary insertObject:dic1 atIndex:0];
    [ary insertObject:dic2 atIndex:0];
    [ary insertObject:dic3 atIndex:0];
    NSString *str = [[ary valueForKey:@"1"] objectAtIndex:1];
    NSLog(@"%@",str);


在从array中取得dictionary的value的时候,切记要指定index因为数组中的dictionary可能有好多key为1的数据,它会根据index位置获得正确的数据,如果上面的程序这样写NSString *str = [[ary valueForKey:@"1"] objectAtIndex:0];那么str中应该存取的就是mengtnt,而如果objectAtIndex:2 那结果会输出一个Null。默认情况下如果在相应的位置没有这个dictionary的key,编译器会自动给这个位置加一个NSNull的对象,大家可不要搞混了,NSNull也是个对象,也是继承自NSObject,千万不能把它当作nil处理。只不过apple为了在集合类中表示空对象而定义的一个类,因为不可能在集合中随便插入nil对象。这样就可以避免程序随便的进入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:target:self selector:@selector(DetectSN:) userInfo:nil repeats:YES];

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

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


0 0
原创粉丝点击