您好,欢迎访问三七文档
1.回答person的retainCount值,并解释为什么 Person*per=[[Personalloc]init];此时person的retainCount的值是1self.person=per; 在self.person时,如果是assign,person的retainCount的值不变,仍为1若是:retainperson的retainCount的值加1,变为2 若是:copyperson的retainCount值不变,仍为12、这段代码有什么问题吗:@implementationPerson -(void)setAge:(int)newAge{self.age=newAge;}@end会死循环,会重复调用自己!self.age改为_age即可;并且书写不规范:setter方法中的newAge应该为age3、这段代码有什么问题,如何修改 for(inti=0;isomeLargeNumber;i++){NSString*string=@”Abc”; string=[stringlowercaseString]; string=[stringstringByAppendingString:@xyz];NSLog(@“%@”,string); } 会出现内存泄露 修改之后: for(inti=0;i1000;i++){NSAutoreleasePool*pool1=[[NSAutoreleasePoolalloc]init];NSString*string=@Abc; string=[stringlowercaseString]; string=[stringstringByAppendingString:@xyz];NSLog(@%@,string);//释放池[pool1drain];}延伸:堆栈的区别:(1)管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。(2)申请大小:能从栈获得的空间较小,堆是向高地址扩展的数据结构,是不连续的内存区域。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。(3)碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出(4)分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。(5)分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。4、写一个便利构造器+(id)Person{Person*person=[Personalloc]init]; return[personautorelease];备注:ARC时不用autorelease}5、截取字符串”20|”中,”|”字符前面和后面的数据,分别输出它们。��NSString*str=@20| NSArray*array=[strcomponentsSeparatedByString:@|];//这是分别输出的截取后的字符串for(inti=0;i[arraycount];++i){NSLog(@%d=%@,i,[arrayobjectAtIndex:i]);}6、用obj-c写一个冒泡排序-(void)mySort:(NSMutableArray*)mutArray{idtmpObj=nil; unsignedlongflag=mutArray.count-1;//flag:最大脚标while(flag0){intk=flag; flag=0; for(intj=0;jk;j++){intorder=NSOrderedAscending;//或NSOrderedDescending if([[mutArray[j]description]compare:[mutArray[j+1]description]]==-order){tmpObj=mutArray[j];mutArray[j]=mutArray[j+1];mutArray[j+1]=tmpObj;flag=j;}}}}延伸:C语言的冒泡排序:(1)冒泡法对一维数组中的元素进行排序voidsort(intarr[],intarr_len) {for(inti=0;iarr_len-1;i++)//外层循环{for(intj=0;jarr_len-1-i;j++)//借助j实现一趟的次数{if(arr[j]arr[j+1]){inttemp=0;temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}}(2)用指针数组给字符串排序 voidsort_a(char*name[],intn){char*temp; for(inti=0;in-1;i++){for(intj=0;jn-1-i;j++){if(strcmp(name[j],name[j+1])0){ temp=name[j];name[j]=name[j+1];name[j+1]=temp;}}}}(3)给字符串数组排序 voidrang(charstr[][20],intn){for(inti=0;in-1;i++){for(intj=0;jn-1-i;j++){intresult=strcmp(str[j],str[j+1]);if(result=0) {chartemp[20];strcpy(temp,str[j]);strcpy(str[j],str[j+1]);strcpy(str[j+1],temp);}}}}7、简述你对UIView、UIWindow和CALayer的理解UIView:属于UIkit.framework框架,负责渲染矩形区域的内容,为矩形区域添加动画,响应区域的触摸事件,布局和管理一个或多个子视图UIWindow:属于UIKit.framework框架,是一种特殊的UIView,通常在一个程序中只会有一个UIWindow,但可以手动创建多个UIWindow,同时加到程序里面。UIWindow在程序中主要起到三个作用:1、作为容器,包含app所要显示的所有视图 2、传递触摸消息到程序中view和其他对象 3、与UIViewController协同工作,方便完成设备方向旋转的支持CAlayer:属于QuartzCore.framework,是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。UIView和CALayer是相互依赖的,UIView依赖CALayer提供内容,CALayer依赖UIView一共容器显示绘制内容。 延伸:UIViewController:管理视图的几成熟,每个视图控制器都有一个自带的视图,并且负责这个视图相关的一切事务。方便管理视图中的子视图,负责model与view的通信;检测设备旋转以及内存警告;是所有视图控制类的积累,定义了控制器的基本功能。UIResponder的那张图���������������������������8、写一个完整的代理,包括声明,实现 //创建 @protocolBeforeMarriedDelagateNSObject@required-(void)doCook:(NSString*)foodName;-(void)doHomework; @optional -(void)driveCar;-(void)makeMoney;@end//声明 @interfaceBoy:NSObjectBeforeMarriedDelagate-(void)doCook:(NSString*)foodName;-(void)doHomework;-(void)makeMoney; //实现@implementationBoy -(void)doCook:(NSString*)foodName {NSLog(@做饭:%@!,foodName);} -(void)doHomework {NSLog(@今天洗衣服!);} -(void)makeMoney {NSLog(@Coding!!);} @end 9、分析json、xml的区别?json、xml解析方式的底层是如何处理的? 区别: (1)可读性方面:基本相同,xml的可读性比较好 (2)可扩展性方面:都具有很好的扩展性 (3)编码难度方面:相对而言:JSON的编码比较容易(4)解码难度:json的解码难度基本为零,xml需要考虑子节点和父节点(5)数据体积方面:json相对于xml来讲,数据体积小,传递的速度跟快些(6)数据交互方面:json与JavaScript的交互更加方面,更容易解析处理,更好的数据交互(7)数据描述方面:xml对数据描述性比较好 (8)传输速度方面:json的速度远远快于xmlJSON底层原理:遍历字符串中的字符,最终根据格式规定的特殊字符,比如{}号,[]号,:号等进行区分,{}号是一个字典的开始,[]号是一个数组的开始,:号是字典的键和值的分水岭,最终乃是将json数据转化为字典,字典中值可能是字典,数组,或字符串而已。 XML底层原理:XML解析常用的解析方法有两种:DOM解析和SAX解析。DOM采用建立树形结构的方式访问XML文档,而SAX采用的事件模型。。DOM解析把XML文档转化为一个包含其内容的树,并可以对树进行遍历。使用DOM解析器的时候需要处理整个XML文档,所以对性能和内存的要求比较高。SAX在解析XML文档的时候可以触发一系列的事件,当发现给定的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX对内存的要求通常会比较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分数据时,SAX这种扩展能力得到了更好的体现。延伸:SAX与DOM的区别:1、SAX处理的优点非常类似于流媒体的优点。分析能够立即开始,而不是等待所有的数据被处理。而且由于应用程序只是在读取数据时检查数据,因此不需要将数据存储在内存中。这对于大型文档来说是个巨大的优点。事实上,应用程序甚至不必解析整个文档;它可以在某个条件得到满足时停止解析。一般来说,SAX还比它的替代者DOM快许多。另一方面,由于应用程序没有以任何方式存储数据,使用SAX来更改数据或在数据流中往后移是不可能的。 2、DOM以及广义的基于树的处理具有几个优点。首先,由于树在内存中是持久的,因此可以修改它以便应用程序能对数据和结构作出更改。它还可以在任何时候在树中上下导航,而不是像SAX那样是一次性的处理。DOM使用起来也要简单得多。另一方面,在内存中构造这样的树涉及大量的开销。大型文件完全占用系统内存容量的情况并不鲜见。此外,创建一棵DOM树可能是一个缓慢的过程。 3、选择DOM还是选择SAX,这取决于下面几个因素: 应用程序的目的:如果打算对数据作出更改并将它输出为XML,那么在大多数情况下,DOM是适当的选择。并不是说使用SAX就不能更改数据,但是该过程要复杂得多,因为您必须对数据的一份拷贝而不是对数据本身作出更改。 数据容量:对于大型文件,SAX是更好的选择。数据将如何使用:如果只有数据中的少量部分会被使用,那么使用SAX来将该部分数据提取到应用程序中可能更好。另一方面,如果您知道自己以后会回头引用已处理过的大量信息,那么SAX也许不是恰当的选择。
本文标题:ios面试题
链接地址:https://www.777doc.com/doc-2877494 .html