C以及Objective-C测试题讲解(下)

接前天的博客,今天继续讲解后27题。测试题地址:http://www.eosgarden.com/en/articles/objc-quizz/take/

31.Which of the following can be inherited?

以下哪些可被继承?

答案:protocols,classes。协议和类

说明:要注意categories无法被继承。

32.How do you throw an exception?

如何抛出异常?

答案:@throw e

说明:Object-C语言的异常处理符号和C++、JAVA相似。再加上使用NSException,NSError或者自定义的类,你可以在你的应用程序里添加强大的错误处理机制。异常处理机制是由这个四个关键字支持的:@try,@catch,@thorw,@finally。

33.What will be printed by the following program?

以下程序的输出结果是?

#include <stdio.h>
int main( void )
{
    int x = 3;
    printf( "%d", x++  +  ++x );
    return 0;
}

答案:Undefined behavior 不明确

说明:The C specification says that changing the value of a same variable multiple times in the same statement results in an undefined behavior.C语言规范说同一个变量在同一语句中被改变多次,其结果是不明确的。笔者刚开始以为是7,但xcode中运行后发现结果是8,果然很奇葩。

34.What will be printed by the following program?

以下程序的输出结果是?

#include <stdio.h>
int main( void )
{
    printf( "%u", -1 );
    return 0;
}

答案:最大的int值。

说明:基础,涉及负数的补码。

35.What class specifiers are supported by Objective-C?

OC中支持的类说明符是?

答案:OC不支持类说明符。

说明:就是不支持。

36.Which are true about the "realloc" function?

以下关于"realloc"方法的正确说法是?

void * realloc( void * ptr, size_t size );

答案:It changes the size of the allocated memory pointed to by the first argument.改变了第一个参数所指向的分配的内存大小。
The newly allocated memory will be uninitialized.新分配的内存将是未初始化的。

A NULL pointer can be passed safely as first argument.空指针可作为realloc的第一个参数。

说明:realloc的作用就是重新分配内存,先判断当前的指针是否有足够的连续空间,如果有,扩大mem_address指向的地址,并且将mem_address返回,如果空间不够,先按照newsize指定的大小分配空间,将原有数据从头到尾拷贝到新分配的内存区域,而后释放原来mem_address所指内存区域,同时返回新分配的内存区域的首地址。即重新分配存储器块的地址。另外新分配的内存是未初始化的,空指针可以作为其第一个参数。

37.When was Objective-C 2.0 released by Apple?

OC2.0啥时候出的?

答案:2007

说明:这题真的没有什么意义,咱测的是技术,又不是历史。

38.Is it absolutely necessary for an Objective-C class to have "NSObject" as root class?

OC中的类将NSObject作为基类一定是必要的吗?
答案:不必要

说明:不一定要以NSObject为基类,但是这样的话要注意“init”、“alloc”等继承自NSObject的方法就不能使用了。

39.When using the "removeObjectAtIndex:" method of the "NSMutableArray" class, is the retain count of the removed object changed?

当使用NSMutableArray的removeObjectAtIndex:方法时,被移出的对象的引用计数会改变吗?

答案:会的

说明:用过的都知道,NSMutableArray和NSMutableDictionary在加入对象时引用计数+1,移出时-1。

40.What can you say about the code below, assuming we are developing for iPhone OS?

假设我们开发iOS程序,你怎么看以下代码?

- (void)bar
{
    NSArray * array = [NSArray arrayWithObjects: @"Hello", @"world", nil];
}
- (void)foo
{
    [NSThread detachNewThreadSelector:@selector(bar) toTarget:self withObject:nil];
}

答案:Runtime error 运行时错误

说明:标准答案是运行时错误,笔者对此稍有疑问。这段代码看起来的确是有内存泄露,使用类构造方法构造的对象将是autorelease(自释放)的,而这个方法在子线程中运行,iOS程序无垃圾回收机制,多线程状态下,子线程必须拥有一个autorelease pool(自动释放池)来管理autorelease对象。但是这段代码应该还不至于造成运行时错误,亲测,Xcode4.6.2,iPad simulator 6.1,运行时并未报错。但还是要郑重提醒,有内存泄露的代码是不可取的,虽然当时可能没什么问题,但等出问题的时候你再想去定位问题所在就很费时费力了。

41.What is the correct syntax for declaring the prototype of a block named "foo" returning an integer and taking a character pointer as argument?

以下声明一个名字为“foo”,返回一个整型,并以一个字符指针作为参数的正确的block语法是?

答案:int( ^ foo )( char * );

说明:其实仔细看就能发现block的声明语法和函数指针的声明语法相当类似,block的强大之处在于可以修改同一作用域下的变量。

42.What will be printed by the following program?

以下程序的输出?

#include <stdio.h>
int main( void )
{
    int x = 0xFF;
    printf( "%d", x << 2 );
    return 0;
}

答案:1020

说明:基础,左移2位就是乘以4,255X4=1020。

43. What type of variable do you need to use to implement the singleton pattern?

当你要使用单例模式的时候,变量应当定义为什么类型?

答案:static 静态类型

说明:不管是懒汉式还是饿汉式,只要用到单例,都应该确保这个类有且仅有一个实例,static静态类型是必须的。

44. What will be printed by the following program?

以下程序的输出?

#include <string.h>
#include <stdio.h>
char * get_ptr( void );
char * get_ptr( void )
{
    static char ptr[ 10 ] = "123456789";
    return ptr;
}
int main( void )
{
    char * ptr = "00000";
    strcpy( get_ptr() + 4, ptr );
    ptr = get_ptr();
    5[ strcpy( ptr, "12345" ) ] = ‘6‘;
    printf( "%s\n", get_ptr() );
    return 0;
}

答案:123456000

说明:看到"5[strcpy(ptr, "12345")] = ‘6‘;"这行时还真愣住了,一般不这么写,但是这种写法的确是不会报错的。

45.What is a category?

OC中category(分类)是什么?

答案:一种给既存的类添加方法的手段。

说明:注意category不能给既存类添加变量,如要添加变量,还是用继承吧。

46.What will be printed by the following program?

以下程序的输出?

#include <stdio.h>
void foo( char ** s );
void foo( char ** s )
{
    ++s;
}
int main( void )
{
    char * s = "Hello World!";
    foo( &s );
    foo( &s );
    printf( "%s\n", s );
    return 0;
}

答案:Hello World!

说明:形式参数和实际参数的问题

47.Does the retain count of an object change when you send an autorelease message to it?

当你发送autorelease消息给一个对象时,它的引用计数会改变吗?

答案:不会

说明:发送autorelease消息后,对象会被加入autorelease pool(自动释放池),这时引用计数是不会改变的。当自动释放池drain的时候,对象会收到relase消息,此时引用计数才会减一。

48.What will be printed by the following program, assuming it will run on an architecture with 8 bytes pointers?

以下程序的输出结果?假设我们是运行在一个8字节指针的架构上。

#include <stdio.h>
int main( void )
{
    const char foo[] = "Hello";
    const char * bar = " Universe!";
    printf( "%lu\n", sizeof( foo ) + sizeof( bar ) );
    return 0;
}

答案:14

说明:foo为数组,sizeof(foo)为6(注意字符串结尾符“\0”),bar为指针,sizeof(bar)为8,6 + 8 = 14。sizeof的时候要注意数组与指针的差别。

49.What does Objective-C not support?

以下选项中哪些是OC不支持的?

答案:Class variables 类变量,Private methods 私有方法,Protected methods 保护方法。

说明:和c++不同,OC不支持类静态成员变量(也就是不支持class variables),通常的做法是在class之外定义静态变量来代替。另外OC中的方法没有公有私有之分,都是公有的。

50.What is the C type behind the Objective-C ‘id‘ type, used to represent objects?

OC中的“id”类型实质上是C的什么类型?

答案:structure 结构体

说明:这题涉及的就比较底层了,id类型在objc.h文件中被定义,代码如下:

typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;

51. What will be printed by the following program?

以下程序的输出?

#include <stdio.h>
int main( void )
{
    int a    = 31;
    int b    = 10;
    int c    = 3;
    double d =  a / b % c;
    printf( "%f\n", d );
    return 0;
}

答案:0

说明:确切的说应该是0.000000

52.In the following code, what is the value returned by the last statement?

以下代码最后一条语句的返回值是?

#define M( x, y ) ( ( x ) < ( y ) ? ( x ) : ( y ) )
#define N( x, y, z ) ( M( x, M( y, z ) ) )
N( 1, 2, 3 )

答案:1

说明:基础,注意define宏定义时应注意括号的使用。

53.Which of the following is false?

以下说法错误的是?

答案:The called object is available as an automatic variable (like self or super) when a method is called.
Methods in static libraries must be present at link time.

说明:真心不太懂这两句话的意思。不知其正确的说法是?

54.What happens if two categories define methods with the same names for the same class?

当两个categories(分类)为同一个类定义了同名的方法时会怎样?

答案:Undefined behavior不确定

说明:运行时会随机选择,记住,不要轻易去尝试这种代码!会妨碍你定位bug。

55. In the following code, what is the value of "y" after the last statement?

以下代码中,最后一条语句的y值是多少?

#define ADD( x ) x + 1
int x = 5;
int y = 10;
y = ADD( x ) * 2;

答案:7

说明:基础,define只是简单替换,define定义中注意括号的使用,防止结果与预想的不一致。

56.What happen when an exception is thrown in an @synchronized block?

当@synchronized块中有异常抛出时,会发生什么?

答案:对象解锁

说明:@synchronized块的作用一般是多线程编程时给对象上锁,达到互斥的目的,有异常抛出时,对象解锁。

57.Is there a memory leak in the following code?

以下代码是否有内存泄露?

@interface Foo: NSObject
{
    id object;
}
@property( retain ) __strong id object;
- ( id )initWithObject: ( id )object;
@end
@implementation Foo
@synthesize object;
- ( void )dealloc
{
    [ object release ];
    [ super dealloc ];
}
- ( id )initWithObject: ( id )o
{
    if( ( self = [ self init ] ) )
    {
        self.object = [ o retain ];
    }
    return self;
}
@end

答案:有内存泄露

说明:@property的时候设置了retain属性,那么在对象赋值的时候调用系统自动生成的set方法就会retain一次,所以initWithObject中对象o的retain是多余的,这将导致引用计数一直大于0,内存不被释放,造成内存泄露

PS:再次感谢提供该测试地址的 @im_xiaobin 以及提出宝贵建议的 @delo @厉害的小花,还有能抽出时间阅读我这篇技术博客的人们!!!

原文链接:http://blog.csdn.net/xiemotongye/article/details/8922352

时间: 2024-10-29 19:13:29

C以及Objective-C测试题讲解(下)的相关文章

C以及Objective-C测试题讲解(上)

测试地址:http://www.eosgarden.com/en/articles/objc-quizz/take/ 这是前几天好友共享的Obj-C测试题,共57题.自以为精通OC了的本人去做了下测试题,结果受到了较为严重的精神打击,考点非常细,有些甚至非常底层.准备分2次讲解这些题目,下面逐个讲解这些考题.其中有一些题目笔者自身也有一些疑问,欢迎探讨. 1.What is "Nil" in Objective-C? “Nil”在OC中是什么? 答案:(void *)0 说明:'NUL

PHP测试题讲解(20161027)

注: 关联数组 关联数组,它的每个 ID 键都关联一个值.在存储有关具体命名的值的数据时,使用数值数组不是最好的做法.通过关联数组,我们可以把值作为键,并向它们赋值. 例子 1 在本例中,我们使用一个数组把年龄分配给不同的人: $ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34); 例子 2 本例与例子 1 相同,不过展示了另一种创建数组的方法: $ages['Peter']

dbus使用讲解- 下(转)

转自:http://blog.csdn.net/fmddlmyy/article/details/3798048 4.复杂的数据类型 在dbus中怎样处理复杂的数据类型?第一个建议是尽量不要使用复杂的数据类型.但如果确实需要呢?有的网友建议用GArray作为容器,不管什么参数,在客户端都手工放入GArray,在服务器端再自己取出来.这确实是个思路,比较适合服务器和客户端都是自己开发的情况.还有一篇"How to pass a variant with dbus-glib" 介绍了怎样用

品茗论道说广播(Broadcast内部机制讲解)(下)

下面我们来看,递送广播动作中最重要的processNextBroadcast(). 3.2 最重要的processNextBroadcast() 从processNextBroadcast()的代码,我们就可以看清楚前面说的“平行广播”.“有序广播”和“动态receiver”.“静态receiver”之间的关系了. 我们在前文已经说过,所有的静态receiver都是串行处理的,而动态receiver则会按照发广播时指定的方式,进行“并行”或“串行”处理.能够并行处理的广播,其对应的若干recei

2.1-Redis配置讲解(下)

Redis AOF持久化相关配置 appendonly no    #如果是yes,则开启aof持久化 appendfilename "appendonly.aof"   # 指定aof文件名字,同样存在dir定义目录下. appendfsync everysec   #指定fsync()调用模式,有三种no(不调用fsync),always(每次写都会调用fsync),everysec(每秒钟调用一次fsync).第一种最快,第二种数据最安全,但性能会差一些,第三种为这种方案,默认为

学习之前,先讲解下各种服务器模型,还有muduo的服务器模型

方案0:accept+read/write,阻塞,一次服务一个客户. 方案1:accept+fork,阻塞,采用多进程,长连接,并发性低,开销高,process-per-connection 方案2:accept+thread,阻塞,采用多线程,长连接,并发性中,开销中,多连接互通,thread-per-connection. 方案3:prefork,方案2的变形. 方案4:prethread,方案3的变形. // 开始采用I/O复用 方案5:poll(reactor),无阻塞,并发性高,开销低

形象易懂讲解算法I——小波变换

https://zhuanlan.zhihu.com/p/22450818?refer=dong5 最早发于回答:能不能通俗的讲解下傅立叶分析和小波分析之间的关系? - 咚懂咚懂咚的回答现收入专栏. 从傅里叶变换到小波变换,并不是一个完全抽象的东西,可以讲得很形象.小波变换有着明确的物理意义,如果我们从它的提出时所面对的问题看起,可以整理出非常清晰的思路. 下面我就按照傅里叶-->短时傅里叶变换-->小波变换的顺序,讲一下为什么会出现小波这个东西.小波究竟是怎样的思路.(反正题主要求的是通俗形

【CNMP系列】CentOS7.0下安装Nginx服务

话步前言,CNMP之路,系统起步:http://www.cnblogs.com/riverdubu/p/6425028.html 这回我来讲解下CentOS7.0下如何安装和配置Nginx服务 Nginx的历史不在此赘述,轻量,快是它的特性.只是因为现在的模块没有达到apache的模块数量级,未来有超越apache的势头. 首先,我们要安装个必要的软件(上节提到过,可能有人并未安装) #yum install wget 因为Nginx以来与gcc的编译环境,所以,在mini centos中需要安

[项目构建 十]babasport 集群下session共享问题的解决方案.

这一篇博客来讲解下babasport这个项目中使用的Login功能, 当然这里说的只是其中的一些简单的部分, 记录在此 方便以后查阅. 一: 去登录页面首先我们登录需要注意的事项是, 当用户点击登录按钮时,转入登录页面时也要记住之前用户是从哪个页面发送请求过来的, 这样登录成功后还能继续跳回到用户之前浏览的那个页面.我们页面展示显示的登录按钮都是集成在一个common的jsp中, 前台每个页面都是引用的这个jsp, 所以需要在这个common的jsp中直接添加点击登录按钮跳转的页面.这里点击登录