您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 招聘面试 > 12iOS面试题合集(77道)【有答案】--_20160223_093912
1.#import和#include的区别@class?@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文件中还是需要使用#import而#import比起#include的好处就是不会引起交叉编译2.readwrite,readonly,assign,retain,copy,nonatomic属性的作用@property是一个属性访问声明,扩号内支持以下几个属性:1,getter=getName,setter=setName,设置setter与getter的方法名2,readwrite,readonly,设置可供访问级别2,assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题3,retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序(CC上有相关资料)4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的…)。3.在一个对象的方法里面:self.name=“object”;和name=”object”有什么不同吗?答:self.name=”object”:会调用对象的setName()方法;name=“object”:会直接把object赋值给当前对象的name属性。4.请简述self.name=nil的机制,以及与[namerelease]的区别?self.name=nil;//使用nil参数调用setName:方法[namerelease]生成的访问器将自动释放以前的name对象5.请简要说明viewDidLoad和viewDidUnload何时调用答:viewDidLoad在view从nib文件初始化时调用,loadView在controller的view为nil时调用。此方法在编程实现view时调用,view控制器默认会注册memorywarningnotification,当viewcontroller的任何view没有用的时候,viewDidUnload会被调用,在这里实现将retain的viewrelease,如果是retain的IBOutletview属性则不要在这里release,IBOutlet会负责release。6.实例化一个UITableView对象,要求写出关键语句?答:UITableView*my=[[UITableViewalloc]initWithFrame:(CGRect)framestyle:(UITableViewStyle)style];my.delegate=self;my.dataSource=self;首先需要分配空间设置表格类型然后需要设置两个必须的委托对象。7.使用sql语句查询出省名以湖开头,邮编为436001所在的市区?(5分)(表名及字段名自定义)select*fromcityswherepostcode=436001andprovince=’湖%’;8.打印结果main(){inta[5]={1,2,3,4,5};int*ptr=(int*)(&a+1);printf(“%d,%d”,*(a+1),*(ptr-1));}答:2,5*(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5&a+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*)a,&a的地址是一样的,但意思不一样a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].voidFunc(charstr[100]){sizeof(str)=?}void*p=malloc(100);sizeof(p)=?这题很常见了,Func(charstr[100])函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等操作,可以被修改。WindowsNT32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof(str)、sizeof(p)都为4。9.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)答:#defineSECONDS_PER_YEAR(60*60*24*365)UL我在这想看到几件事情:#define语法的基本知识(例如:不能以分号结束,括号的使用,等等)懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型数。如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很重要。10.写一”标准”宏MIN,这个宏输入两个参数并返回较小的一个答:#defineMIN(A,B)((A)=(B)?(A):(B))这个测试是为下面的目的而设的:标识#define在宏中应用的基本知识。这是很重要的,因为直到嵌入(inline)操作符变为标准C的一部分,宏是方便产生嵌入代码的唯一方法,对于嵌入式系统来说,为了能达到要求的性能,嵌入代码经常是必须的方法。三重条件操作符的知识。这个操作符存在C语言中的原因是它使得编译器能产生比if-then-else更优化的代码,了解这个用法是很重要的。懂得在宏中小心地把参数用括号括起来我也用这个问题开始讨论宏的副作用,例如:当你写下面的代码时会发生什么事?least=MIN(*p++,b);结果是:((*p++)=(b)?(*p++):(*p++))这个表达式会产生副作用,指针p会作三次++自增操作。11.数组和指针的区别(1)数组可以申请在栈区和数据区;指针可以指向任意类型的内存块(2)sizeof作用于数组时,得到的是数组所占的内存大小;作用于指针时,得到的都是4个字节的大小(3)数组名表示数组首地址,值不可以改变,如不可以将++作用于数组名上;普通指针的值可以改变,如可将++作用于指针上(4)用字符串初始化字符数组是将字符串的内容拷贝到字符数组中;用字符串初始化字符指针是将字符串的首地址赋给指针,也就是指针指向了该数组12.static的作用(1)函数体内static变量的作用范围为该函数体,不同于auto变量,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;(2)在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;(3)在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明它的模块内;(4)在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;(5)在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量。13.简述内存分区情况(1)代码区:存放函数二进制代码(2)数据区:系统运行时申请内存并初始化,系统退出时由系统释放。存放全局变量、静态变量、常量(3)堆区:通过malloc等函数或new等操作符动态申请得到,需程序员手动申请和释放(4)栈区:函数模块内申请,函数结束时由系统自动释放。存放局部变量、函数参数14.#includefilename和#include”filename”有什么区别答:#includefilename直接在库文件目录中搜索所包含的文件;#include”filename”在当前目录下搜索所包含的文件,如果没有的话再到库文件目录搜索。15.constchar*p;charconst*p;char*constp;constchar*constp;四个修饰指针有什么区别答:(1)定义了一个指向不可变的字符串的字符指针(2)和(1)一样(3)定义了一个指向字符串的指针,该指针值不可改变,即不可改变指向(4)定义了一个指向不可变的字符串的字符指针,且该指针也不可改变指向16.MVC的理解?答:MVC模式考虑三种对象:模型对象、视图对象和控制器对象。模型对象负责应用程序的数据和定义操作数据的逻辑;视图对象知道如何显示应用程序的模型数据;控制器对象是M与V之间的协调者。17.在Obj-c中有没有私有方法?私有变量?一般采用什么方法实现?objective-c–类里面的方法只有两种,静态方法和实例方法.这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话,对于一些小范围的代码重用就不那么顺手了.在类里面声名一个私有方法@interfaceController:NSObject{NSString*something;}+(void)thisIsAStaticMethod;-(void)thisIsAnInstanceMethod;@end@interfaceController(private)-(void)thisIsAPrivateMethod;@end@private可以用来修饰私有变量在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的18.OC中加号方法与减号的区别?加号方法是类方法,属于静态方法减号方法是实例方法必须由类的实例来调用19.free与release的区别20.在终端环境下,分别说明4,2,1,0对应的权限是什么21.ARC机制ARC就是automaticreferencecounting,简单说就是就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。使用ARC的好处使用ARC有什么好处呢?看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了代码的总量变少了,看上去清爽了不少,也节省了劳动力代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性不好的地方记住一堆新的ARC规则—关键字及特性等需要一定的学习周期一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关22.自动释放池是什么,如何工作当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,自动释放池就会被释放,池中的所有对象也就被释放。1.ojc-c是通过一种”referringcounting”(引用计数)的方式来管理内存的,对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一,每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0,就会被系统销毁.2.NSAutoreleasePool就是用来做引用计数的管理工作的,这个东西一般不用你管的.3.autorelease和release没什么区别,只是引用计数减一的时机不同而已,autor
本文标题:12iOS面试题合集(77道)【有答案】--_20160223_093912
链接地址:https://www.777doc.com/doc-4405004 .html