第十一讲.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>.类目可以为所有类添加方法,同时无论能否拿到类的源码,类目都可以对其扩展
NSString *str=@"hello";
NSMutableSet *mt=[NSMutableSet setWithObjects:str, nil];
[mt addObject:str];
NSLog(@"%lu",mt.count);
结果是:
答案:(A)
解析:集合是以对象为元素计数的,所以str只是mt其中的一个元素.
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
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)
解析:此题对键值在数组中进行了对调,计算时细心即可.同时要清楚键是唯一的,不能重复.
@interface MyClass : NSObject
{
int number;
}
+(void) printNumber;
@end
@implementation MyClass
+(void) printNumber
{
number =10;
NSLog(@""%d"",number);
}
@end
答案:(D)
NSString *str = [NSString stringWithFormat:@”abc”];
NSString *str2 = [str retain];
[pool release];
NSLog(@”str retainCount = %d,str2 retainCount = %d”,[str retainCount],[str2 retainCount]);
上述代码打印结果正确的是:
答案:(C)
NSString * aString = [[NSString alloc] initWithString:@"123"];
[aString autorelease];
NSMutableArray * arr = [NSMutableArray array];
[arr addObject:aString];
NSLog(@"string = %lu",[aString retainCount]);
答案:(C)
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的输出格式限制,只能输出第一个)