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

3 篇文章 0 订阅

NSString 、NSMutableString类

cocoa把字符串处理封装到NSString类中了,这个类提供了字符串处理的常用方法,详细请见apple develop document。在这里你要了解到NSString类的那些特征那,下面请看一段代码:

    NSString *temp =[[NSString alloc] initWithString:@"test"];
    //NSLog(@"%d",[temp retainCount]);
    [temp release];

    //NSLog(@"%d",[temp retainCount]);

    NSMutableString *str=[[NSMutableString alloc] initWithString:temp];
    [str appendFormat:@"NSString"];
    NSLog(@"%@",str);


有兴趣的可以在xcode中创建一个控制台程序,把上面的代码复制进去,可以看到确实是我们预期的结果。学习过objective c内存管理的肯定就会有疑问了,temp已经释放了,为什么str中还能和temp中的字符串拼接那?

引用计数,这个你不会没有听过吧,那你就要再好好学习下objective c的内存管理了。程序再次运行时,你会发现控制台中会输出两个-1,也就是alloc和release根本就没有起到任何作用,难道NSString类不适用于objective c的内存管理么?显然不是,原因就在于NSString类中的字符串都定义在常量区,常量区并不是程序员为对象在内存中申请的空间,而是编译起给一些变量分配的空间,所以说你根本无法取得它的引用计数,因为这个字符串的分配,根本不受你的控制,完全是编译起去控制的。所以你看到的都是-1。那么如果给NSMutableString类型的str取retainCount那答案会是什么哪?有兴趣的可以实验下,应该是1。因为NSMutableString虽说它初始化的字符串在常量区,但是NSMutalbeString不像NSString简单的存取字符串的信息,它还要存取字符串的容量以及一些其他信息供字符串扩展,所以自然和NSString就不太一样了。具体NSMutableString是怎么实现的那就要问问apple的工程师了。

NSArray NSMutableString类

    首先还是先看段代码,眼见为实,代码可以说明一切。假如你有两个类Person和Animal那么你就可以写如下的代码,来访问你定义再array对象中的实例了:

    Person *aMan = [[Person alloc] init];

    Animal *dog   = [[Animal alloc] init];

    NSArray *aryMammal = [[NSArray arrayWithObjects:aMan,dog]];

    [aMan release];

    [dog release];

    for(id someThing for aryMammal)

    {

         NSLog(@"%@", [someThing getName]];  //假如说你定义的类有这个方法可以获得对象的名字

    }


按照我们学过的objective c内存管理的理论分析的话,程序会在for循环中,抛出一个不能识别的selector发向一个实例的异常。但是你可以运行一下,程序非常的正常,没有任何的异常。你可以用上面的策略retainCount来看下对象aMan和dog的变化。之后你就很容易发现问题在哪里了。下面还是为一些不愿动手的同志,分析一下结果吧。如果照上面所说的在NSArray后面用retainCount来获取aMan和dog的的引用计数的,你会发现这两个实例的retainCount都变成了2,自然release之后对象还是没有销毁的。所以由这里可以推测出我们向一个容器里面放对象的时候,对象的引用计数会自动加

    下面来看下NSMutableArray的一些特征。当你想要遍历一个NSMutableArray的时候,然后找到某个特殊的对象,用另外一个对象替代这个对象的时候,代码如下:

   int i = 0;

    for(id temp in mutableAry)

   {

        if([temp equal:aObject])

            [mutableAry replaceObjectAtIndex:i withObject:aObject];

        i++;

   }


答案是只要你的程序进到了if语句里面,下次执行for循环的时候程序就会崩溃,报出的错误是bad access,在之后的博客里我会和大家一块分享下,xcode程序运行中的常见错误。下面就来分析下这种错误的原因吧。 用for(id temp in mutableArray)的时候,切记不能在for循环中为mutableArray添加任何东西,因为for循环在开始的时候,会把array中的所有数据都放到一个stack中,stack中存着array中对象的指针。如果你改变了array中的对象,原来对象的指针就销毁了,而stack中仍然存着这个指针,访问的时候程序会bad access从而crash。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值