IOS面试题

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

iOS开发:iPhone面试题解答1.main(){inta[5]={};int*ptr=(int*)(a+1);printf(%d%d,*(a+1),*(ptr-1));}答:25*(a+1)就是a[1],*(ptr-1)就是a[4]执行结果是2,5a+1不是首地址+1,编制会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)int*ptr=(int*)(a+1);则ptr实际是(a[5])也就是a+5原因如下:a是数组指针,其类型为int(*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。a是长度为5的int数组指针,所以要加5*sizeof(int)所以ptr实际是a[5]但是prt与(a+1)类型是不一样的(这点很严重)所以prt-1只会减去sizeof(int*)aa的地址是一样的,但意思不一样a是数组首地址,也就是a[0]的地址,a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1]a+1是下一个对象的地址,即a[5].2.以下为WindowsNT下的32位C++程序,请计算sizeof的值voidFunc(charstr[100]){sizeof(str)=?}void*p=malloc(100);sizeof(p)=?这题很常见了Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名遗失了本身的内在,仅仅只是一个指针;在遗失其内在的同时,它还遗失了其常量特性,可以作自增、自减等操作,可以被修改。WindowsNT32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(str)、sizeof(p)都为4。3.还是考指针不过我对cocoa的代码还是不太谙习大概是这样的-(void)*getNSString(constNSString*inputString){isamaintest\n;return;}-main(void){NSString;NSString*aString=[NSStringstringWithString:@%@getNSString(a)];NSLog(@%@\naString);}最后问输出的字符串:NULLoutput在函数返回后,内存已经被开释。对比一下iOS开发。4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(马虎闰年问题)#defineSECONDS_PER_YEAR(60*60*24*365)UL我在这想看到几件事情:?;#define语法的基础学问(例如:不能以分号结束,括号的使用,等等)?;懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。?;意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L告诉编译器这个常数是的长整型数。?;如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很严重。写一个标准宏MIN,这个宏输入两个参数并返回较小的一个。#defineMIN(AB)((A)=(B)?(A):(B))这个测试是为下面的目的而设的:?;标识#define在宏中应用的基础学问。这是很严重的,因为直到嵌入(inline)操作符变为标准C的一局部,iphone。宏是方便产生嵌入代码的唯一方法,对付嵌入式编制来说,为了能达到要求的性能,嵌入代码经常是必须的方法。?;三重条件操作符的学问。这个操作符存在C言语中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很严重的。?;懂得在宏中小心地把参数用括号括起来?;我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least=MIN(*p++b);结果是:((*p++)=(b)?(*p++):(*p++))这个表达式会产生副作用,指针p会作三次++自增操作。5.写一个委托的interface@protocolMyDelegate;@interfaceMyClass:NSObject{idMyDelegatedelegate;}//委托方法@protocolMyDelegate-(void)didJobs:(NSArray*)args;@end6.写一个NSString类的完成+(id)initWithCString:(constchar*)nullTerminatedCStringencoding:(NSStringEncoding)encoding;+(id)stringWithCString:(constchar*)nullTerminatedCStringencoding:(NSStringEncoding)encoding{NSString*obj;obj=[selfallocWithZone:NSDefaultMallocZone()];obj=[objinitWithCString:nullTerminatedCStringencoding:encoding];returnAUTORELEASE(obj);}7.obj-c有多重继承么?不是的话有什么替代方法?cocoa中所有的类都是NSObject的子类多继承在这里是用protocol委托代理来完成的你不用去思索繁琐的多继承虚基类的概念.ood的多态特性在obj-c中通过委托来完成.8.obj-c有私有方法么?私有变量呢objective-c-类里面的方法唯有两种静态方法和实例方法.这似乎就不是完整的面向对象了按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话对付一些小局限的代码重用就不那么利市了.在类里面声名一个私有方法@interfaceController:NSObject{NSString*something;}+(void)thisIsAStaticMethod;-(void)thisIsAnInstsomekindofceMethod;@end@interfaceController(private)-(void)thisIsAPrivateMethod;@end@private可以用来修饰私有变量在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的9.关键字const有什么含意?修饰类呢?static的作用用于类呢?还有externc的作用const意味着只读,下面的声明都是什么意思?constinta;intconsta;constint*a;int*consta;intconst*aconst;前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。结论:?;关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果你曾花很多时间清理其它人留下的渣滓,你就会很快学会感谢这点多余的信息。WindowsMobile。(当然,懂得用const的程序员很少会留下的渣滓让别人来清理的。)?;通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。?;合理地使用关键字const可以使编译器很自然地保护那些不理想被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少insect的出现。(1)欲阻止一个变量被改变,可以使用const关键字。在定义该const变量时,通常须要对它进行初始化,因为以后就没无机会再去改变它了;(2)对指针来说,可以指定指针本身为const,也可以指定指针所指的数据为const,或二者同时指定为const;(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数外部不能改变其值;(4)对付类的成员函数,若指定其为const类型,则表明其是一个常函数,不能修改类的成员变量;(5)对付类的成员函数,有时期必须指定其返回值为const类型,以使得其返回值不为“左值”。关键字volatile有什么含意?并给出三个不同的例子。一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,面试题解答。而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:?;并行设备的硬件寄存器(如:状态寄存器)?;一个中断服务子程序中会访问到的非主动变量(Non-automaticvariables)?;多线程应用中被几个任务共享的变量?;一个参数既可以是const还可以是volatile吗?解释为什么。?;一个指针可以是volatile吗?解释为什么。下面是答案:?;是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。?;是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个drinkstationrier的指针时。static关键字的作用:(1)函数体内static变量的作用局限为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用局限被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象唯有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。externC的作用(1)被externC限定的函数或变量是extern类型的;extern是C/C++言语中表明函数和全局变量作用局限(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用。(2)被externC修饰的变量和函数是按照C言语方式编译和连接的;externC的惯用法(1)在C++中引用C言语中的函数和变量,在包括C言语头文件(假设为cExamplifierle.h)时,需进行下列处理:externC{#includecExamplifierle.h}而在C言语的头文件中,对其外部函数只能指定为extern类型,C言语中不接济externC声明,在.c文件中包括了externC时会出现编译语法错误。其他手机开发。(2)在C中引用C++言语中的函数和变量时,C++的头文件需添加externC,但是在C言语中不能直接引用声明了externC的该头文件,应该仅将C文件中将C++中定义的externC函数声明为extern类型。10.为什么标准头文件都有类似以下的布局?#ifndef__INCvxWorksh#define__INCvxWorksh#ifdef__cplusplusexternC{#endif#ifdef__cplusplus}#endif#endif显然,头文件中的编译宏“#ifndef__INCvxWorksh、#define__INCvxWorksh、#endif”的作用是防止该头文件被重复引用。11.#import跟#include的区别@class呢?@class一般用于头文件中须要声明该类的某个实例变量的时期用到,在m文件中还是须要使用#import而#import比起#include的好处就是不会引起交叉编译12.MVC模式的理解MVC设计模式思索三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的学问和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程

1 / 18
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功