Fork me on GitHub

第十一讲.oc学习补充(description方法,oc测试题纠错)

一.description方法的使用

    1.默认的description方法

     NSLog函数一旦发现用%@输出某个OC对象时,就会调用这个对象的description方法(这个方法返回值是NSString类型,是OC中的字符串类型),并且将description方法返回的字符串代替%@的位置进行输出.

* description方法的默认实现是返回这样的格式:<类名: 对象的内存地址>,因此上面代码的输出结果为:

 

     2.重写description方法

      description方法的默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现.

 

实例分析:

注意:

+description方法决定了类对象的输出结果,即类本身.

-description方法决定了实例对象的输出结果,即Person创建的对象。

 

  3.description方法的陷阱

在调用description方法中,不能使用self,会导致程序的死循环.

 

 4.在内存管理中,description方法优化内存的解决方案(注意autorelease使用位置)

 

    5.相关打印补充扩展

 

 

   二.测试题疑难及解析

    1.(判断题的正确结论)

      1>object-c 是单继承.

      2>数组保存的只能是对象

      3>每个对象都有引用计数

      4>为了保证程序不产生额外内存开销,当对象不再被需要以后,应当被销毁

      5>.类目可以为所有类添加方法,同时无论能否拿到类的源码,类目都可以对其扩展

       2.读代码:
            NSString *str=@"hello";
            NSMutableSet *mt=[NSMutableSet setWithObjects:str, nil];
            [mt addObject:str];
            NSLog(@"%lu",mt.count);
           结果是:

  答案:(A)

  •            

            解析:集合是以对象为元素计数的,所以str只是mt其中的一个元素.

 

 

         3.下面程序段的输出结果是什么:
           NSString * aString = [[NSString alloc] initWithString:@"hehe"];
            [aString autorelease];
           NSMutableArray *arr = [NSMutableArray array];
           [arr addObject:aString];
           NSLog(@"string = %d",[aString retainCount]);

答案:(A)

  •                 

  解析:这样输入,程序会报错,首先retainCount为无符长整型(unsigned long NSUInteger),所以不能%d输出.报错输出为-1

 

    4.下面程序段的输出结果是什么:
  NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"1",@"3",@"1",@"4", nil];
  NSArray *arr1 = [[NSArray alloc] initWithArray:[dic allKeys]];
  NSArray *arr2 = [[NSArray alloc] initWithArray:[dic allValues]];
  NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] initWithObjects:arr1 forKeys:arr2];
  NSLog(@"%@",dic2);

答案:(C)

  •            

解析:此题对键值在数组中进行了对调,计算时细心即可.同时要清楚键是唯一的,不能重复.

 

    

  5. 查看下列代码,能正确输出number的选项是:
    @interface MyClass : NSObject
  {
    int number;
  }
  +(void) printNumber;
  @end
  @implementation MyClass
  +(void) printNumber
  {
    number =10;
    NSLog(@""%d"",number);
  }
  @end

答案:(D)

  •          
  解析:验证过,编译无法通过.
 
 
 
     6. NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
  NSString *str = [NSString stringWithFormat:@”abc”]; 
  NSString *str2 = [str retain];
  [pool release];
  NSLog(@”str retainCount = %d,str2 retainCount = %d”,[str retainCount],[str2 retainCount]);
  上述代码打印结果正确的是:

答案:(C)

  •                 

 

 

 7. 写出下面程序段的输出结果:
  NSString * aString = [[NSString alloc] initWithString:@"123"];
  [aString autorelease];
  NSMutableArray * arr = [NSMutableArray array];
  [arr addObject:aString];
  NSLog(@"string = %lu",[aString retainCount]);

答案:(C)

  •          

 

 8. NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"2",@"3",@"3",@"4", nil];
  NSArray *arr = [[NSArray alloc] initWithArray:[dic allKeys]];
  NSString *str = [[NSString alloc] initWithFormat:[arr objectAtIndex:0],[arr objectAtIndex:1],[arr objectAtIndex:2]];
  NSLog(@"%@",str);
  结果是:

答案:(C)

  •            

运行过程:(原因在于Format的输出格式限制,只能输出第一个)

 

posted @ 2015-09-05 13:09  DengHuiCheng  阅读(183)  评论(0编辑  收藏  举报