IOS面试题
1.Difference between shallow copy and deep copy? 浅复制和深复制的区别,
答案:浅层复制:只复制指向对象的指针,而不复制引用对象本身。
深层复制:复制引用对象本身。
意思就是说我有个A对象,复制一份后得到A_copy对象后,对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不过是是一个指针,对象本身资源
还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改,这其实违背了我们复制拷贝的一个思想。深复制就好理解了,内存中存在了
两份独立对象本身。
用网上一哥们通俗的话将就是:
浅复制好比你和你的影子,你完蛋,你的影子也完蛋
深复制好比你和你的克隆人,你完蛋,你的克隆人还活着。
2.What is advantage of categories? What is difference between implementing a category
and inheritance?
类别的作用,继承和类别在实现中有何区别,
答案:category 可以在不获悉,不改变原来代码的情况下往里面添加新的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)将类的实现分散到多个不同文件或多个不同框架中。
(2)创建对私有方法的前向引用。
(3)向对象添加非正式协议。
继承可以增加,修改或者删除方法,并且可以增加属性。
3.Difference between categories and extensions? 类别和类扩展的区别。
答案:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。 extensions可以认为是一个私有的Category。
Page 1 of 30
4.Difference between protocol in objective c and interfaces in java?
oc中的协议和java中的接口概念有何不同,
答案:OC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。 informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里 “非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。"
现在来看,其实protocal已经开始对两者都统一和
规范
编程规范下载gsp规范下载钢格栅规范下载警徽规范下载建设厅规范下载
起来操作,因为资料中说“非正式协议使用interface修饰“,
现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。
5.What are KVO and KVC?
答案:kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。
很多情况下可以简化程序代码。apple文档其实给了一个很好的例子。
kvo:键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
具体用看到嗯哼用到过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button
[cpp]
[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil];
#pragma mark KVO
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary
*)change context:(void *)context
{
if ([keyPath isEqualToString:@"highlighted"] ) {
Page 2 of 30
[self setNeedsDisplay];
}
}
对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。 对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException异常错误。
(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及_getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
来至cocoa,这个说法应该挺有道理。
因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
可以按照kvc查找的逻辑理解,就说的过去了。
6.What is purpose of delegates?
代理的作用,
答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻
通知
关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知
到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。
另外一点,代理可以理解为java中的回调监听机制的一种类似。
7.What are mutable and immutable types in Objective C?
oc中可修改和不可以修改类型。
答案:可修改不可修改的集合类。这个我个人简单理解就是可动态添加修改和不可动态添加修改一样。
Page 3 of 30
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。
8.When we call objective c is runtime language what does it mean?
我们说的oc是动态运行时语言是什么意思,
答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。 多态:不同对象以自己的方式响应相同的消息的能力叫做多态。意思就是假设生物类(life)都用有一个相同的方法-eat;
那人类属于生物,猪也属于生物,都继承了life后,实现各自的eat,但是调用是我们只需调用各自的eat方法。
也就是不同的对象以自己的方式响应了相同的消息(响应了eat这个选择器)。
因此也可以说,运行时机制是多态的基础,~~~
9.what is difference between NSNotification and protocol?
通知和协议的不同之处,
答案:协议有控制链(has-a)的关系,通知没有。
首先我一开始也不太明白,什么叫控制链(专业术语了~)。但是简单分析下通知和代理的行为模式,我们大致可以有自己的理解
简单来说,通知的话,它可以一对多,一条消息可以发送给多个消息接受者。
代理按我们的理解,到不是直接说不能一对多,比如我们知道的明星经济代理人,很多时候一个经济人负责好几个明星的事务。
只是对于不同明星间,代理的事物对象都是不一样的,一一对应,不可能说明天要处理A明星要一个发布会,代理人发出处理发布会的消息后,别称B的
发布会了。但是通知就不一样,他只关心发出通知,而不关心多少接收到感兴趣要处理。 因此控制链(has-a从英语单词大致可以看出,单一拥有和可控制的对应关系。
10.What is push notification?
什么是推送消息,
答案:太简单,不作答~~~~~~~~~~
这是cocoa上的答案。
其实到不是说太简单,只是太泛泛的一个概念的东西。就好比说,什么是人。
Page 4 of 30
推送通知更是一种技术。
简单点就是客户端获取资源的一种手段。
普通情况下,都是客户端主动的pull。
推送则是服务器端主动push。
11.Polymorphism,
关于多态性
答案:多态,子类指针可以赋值给父类。
这个题目其实可以出到一切面向对象语言中,
因此关于多态,继承和封装基本最好都有个自我意识的理解,也并非一定要把书上资料上写的能背出来。
最重要的是转化成自我理解。
12.Singleton?
对于单例的理解
答案:11,12题目其实出的有点泛泛的感觉了,可能说是编程语言需要或是必备的基础。 基本能用熟悉的语言写出一个单例,以及可以运用到的场景或是你编程中碰到过运用的此种模式的框架类等。
进一步点,考虑下如何在多线程访问单例时的安全性。
13.What is responder chain?
说说响应链
答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。 可以说点事件的分发,传递以及处理。具体可以去看下touch事件这块。因为问的太抽象化了 严重怀疑题目出到越后面就越笼统。
14.Difference between frame and bounds? frame和bounds有什么不同,
答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统) bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)
15.Difference between method and selector? 方法和选择器有何不同,
答案:selector是一个方法的名字,method是一个组合体,包含了名字和实现. 详情可以看apple文档。
Page 5 of 30
16.Is there any garbage collection mechanism in Objective C.?
OC的垃圾回收机制,
答案: OC2.0有Garbage collection,但是iOS平台不提供。
一般我们了解的objective-c对于内存管理都是手动操作的,但是也有自动释放池。 但是差了大部分资料,貌似不要和arc机制搞混就好了。
求更多~~
17.NSOperation queue?
答案:存放NSOperation的集合类。
操作和操作队列,基本可以看成java中的线程和线程池的概念。用于处理ios多线程开发的问题。 网上部分资料提到一点是,虽然是queue,但是却并不是带有队列的概念,放入的操作并非是按照严格的先进现出。
这边又有个疑点是,对于队列来说,先进先出的概念是Afunc添加进队列,Bfunc紧跟着也进入队列,Afunc先执行这个是必然的,
但是Bfunc是等Afunc完全操作完以后,B才开始启动并且执行,因此队列的概念离乱上有点违背了多线程处理这个概念。
但是转念一想其实可以参考银行的取票和叫号系统。
因此对于A比B先排队取票但是B率先执行完操作,我们亦然可以感性认为这还是一个队列。 但是后来看到一票关于这操作队列话题的文章,其中有一句提到
“因为两个操作提交的时间间隔很近,线程池中的线程,谁先启动是不定的。” 瞬间觉得这个queue名字有点忽悠人了,还不如pool~
综合一点,我们知道他可以比较大的用处在于可以帮组多线程编程就好了。
18.What is lazy loading?
答案:懒汉模式,只在用到的时候才去初始化。
也可以理解成延时加载。
我觉得最好也最简单的一个列子就是tableView中图片的加载显示了。
一个延时载,避免内存过高,一个异步加载,避免线程堵塞。
19.Can we use two tableview controllers on one viewcontroller?
是否在一个视图控制器中嵌入两个tableview控制器,
答案:一个视图控制只提供了一个View视图,理论上一个tableViewController也不能放吧, 只能说可以嵌入一个tableview视图。当然,题目本身也有歧义,如果不是我们定性思维认为的
Page 6 of 30
UIViewController,
而是宏观的表示视图控制者,那我们倒是可以把其看成一个视图控制者,它可以控制多个视图控制器,比如TabbarController
那样的感觉。
20.Can we use one tableview with two different datasources? How you will achieve this?
一个tableView是否可以关联两个不同的数据源,你会怎么处理,
答案:首先我们从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。 因此我们并不关心如何去关联他,他怎么关联上,方法只是让我返回根据自己的需要去设置如相关的数据源。
因此,我觉得可以设置多个数据源啊,但是有个问题是,你这是想干嘛呢,想让列表如何显示,不同的数据源分区块显示,
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,5
a+1不是首地址+1,编制会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5
个int)
int *ptr=(int *)( a+1);
Page 7 of 30
则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].
2. 以下为WindowsNT下的32位C++程序,请计算sizeof的值
void Func ( char str[100])
{
sizeof( str ) =?
}
void *p = malloc( 100 );
sizeof ( p ) = ?
这题 很常见了Func (char str[100])函数中数组名作为函数形参时,在函数体内,数组名遗失了本身的内在,仅仅只是一个指针;在遗失其内在的同时,它还遗失了其常量特性,可以作自增、自减等操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str )、sizeof ( p ) 都为4。
3.还是考指针不过我对cocoa的代码还是不太谙习
大概是这样的
Page 8 of 30
- (void)*getNSString(constNSString * inputString)
{
is amaintest\n";
return ;
}
-main(void)
{
NSString";
NSString*aString = [NSStringstringWithString:@"%@"getNSString(a)];
NSLog(@"%@\n"aString);
}
最后问输出的字符串:NULLoutput在函数返回后,内存已经被开释。对比一下iOS开发。
4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(马虎闰年问题)
#define SECONDS_PER_YEAR(60 * 60 * 24 *365)UL 我在这想看到几件事 情:#define语法的基础学问(例如:不能以分号结束,括号的使用,等等)
?;懂得预处理器将为你计算常数表达式的值,因此,直接写出你是如何计算一年中有多少秒而不是计算出实际的值,是更清晰而没有代价的。
Page 9 of 30
?;意识到这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L告诉编译器这个常数是的长整型数。
?;如果你在你的表达式中用到UL(表示无符号长整型),那么你有了一个好的起点。记住,第一印象很严重。
写一个"
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
"宏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
Page 10 of 30
@protocolMyDelegate;
@interface MyClass:NSObject
{
id
delegate;
}
// 委托方法
@protocolMyDelegate
- (void)didJobs:(NSArray*)args;
@end
6.写一个NSString类的完成
+(id)initWithCString:(constchar
*)nullTerminatedCStringencoding:(NSStringEncoding)encoding;
+ (id) stringWithCString:(const char*)nullTerminatedCString
encoding: (NSStringEncoding)encoding
{
NSString*obj;
obj =[self allocWithZone: NSDefaultMallocZone()]; obj = [obj initWithCString:nullTerminatedCString encoding: encoding];
return AUTORELEASE(obj);
Page 11 of 30
}
7.obj-c有多重继承么?不是的话有什么替代方法?
cocoa中所有的类都是NSObject 的子类
多继承在这里是用protocol委托代理 来完成的
你不用去思索繁琐的多继承 虚基类的概念. ood的多态特性在 obj-c中通过委托来完成.
8.obj-c有私有方法么?私有变量呢
objective-c -类里面的方法唯有两种 静态方法和实例方法. 这似乎就不是完整的面向对象了按照OO的原则就是一个对象只暴露有用的东西.如果没有了私有方法的话 对付一些小局限的代码重用就不那么利市了. 在类里面声名一个私有方法
@interface Controller :NSObject { NSString *something; }
+(void)thisIsAStaticMethod;
-(void)thisIsAnInstsome kind ofceMethod;
@end
@interface Controller(private) -
(void)thisIsAPrivateMethod;
@end
@private可以用来修饰私有变量
Page 12 of 30
在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
9.关键字const有什么含意,修饰类呢?static的作用用于类呢?还有extern c的作用
const意味着"只读",下面的声明都是什么意思,
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论:
?;关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果
你曾花很多时间清理其它人留下的渣滓,你就会很快学会感谢这点多余的信息。Windows Mobile。(当然,懂得用const的程序员很少会留下的渣滓让别人来清
理的。)
?;通过给优化器一些附加的信息,使用关键字const也许能产生更紧凑的代码。 ?;合理地使用关键字const可以使编译器很自然地保护那些不理想被改变的参数,防止其被无意的代码修改。简而言之,这样可以减少insect的出现。
(1)欲阻止一个变量被改变,可以使用 const关键字。在定义该 const 变量时,通常须要
Page 13 of 30
对它进行初
始化,因为以后就没无机会再去改变它了;
(2)对指针来说,可以指定指针本身为 const,也可以指定指针所指的数据为 const,或二者同时指
定为 const;
(3)在一个函数声明中,const可以修饰形参,表明它是一个输入参数,在函数外部不能改变其值;
(4)对付类的成员函数,若指定其为 const类型,则表明其是一个常函数,不能修改类的成员变量;
(5)对付类的成员函数,有时期必须指定其返回值为 const 类型,以使得其返回值不为“左值”。
关键字volatile有什么含意?并给出三个不同的例子。
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到
这个变量时必须每次都小心地重新读取这个变量的值,面试题解答。而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
?;并行设备的硬件寄存器(如:状态寄存器)
?; 一个中断服务子程序中会访问到的非主动变量(Non-automaticvariables) ?; 多线程应用中被几个任务共享的变量
?;一个参数既可以是const还可以是volatile吗,解释为什么。?; 一个指针可以是volatile吗,解释为什么。
下 面是答案:
?;是的。一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。
?;是的。尽管这并不很常见。一个例子是当一个中服务子程序修该一个指向一个drink stationrier的指针时。
Page 14 of 30
static关键字的作用:
(1)函数体内 static变量的作用局限为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值;
(2)在模块内的 static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
(3)在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用局限被限制在声明
它的模块内;
(4)在类中的 static成员变量属于整个类所拥有,对类的所有对象唯有一份拷贝; (5)在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static成员变量。
extern "C"的作用
(1)被 extern "C"限定的函数或变量是extern 类型的;
extern 是C/C++言语中表明函数和全局变量作用局限(可见性)的关键字,该关键字告诉编译器,
其声明的函数和变量可以在本模块或 其它模块中使用。
(2)被 extern "C"修饰的变量和函数是按照C 言语方式编译和连接的;
extern"C"的惯用法
(1)在 C++中引用 C言语中的函数和变量,在包括 C 言语头文件(假设为 cExamplifierle.h)时,需进
行下列处理:
extern "C"
Page 15 of 30
{
#include "cExamplifierle.h"
}
而在 C 言语的头文件中,对其外部函数只能指定为 extern 类型,C 言语中不接济 extern "C"声明,在.c 文件中包括了 extern "C"时会出现编译语法错误。其他手机开发。
(2)在 C 中引用C++言语中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 言语中不
能直接引用声明了 extern "C"的该头文件,应该仅将 C 文件中将 C++中定义的 extern"C"函数声明为
extern 类型。
10.为什么标准头文件都有类似以下的布局,
#ifndef__INCvxWorksh
#define__INCvxWorksh
#ifdef__cplusplus
extern "C"{
#endif
#ifdef__cplusplus
}
#endif
#endif
显然,头文件中的编译宏“#ifndef__INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
是防止该头文件被重复引用。
11.#import跟#include的区别@class呢?
@class一般用于头文件中须要声明该类的某个实例变量的时期用到,在m文件中还是须要使用#import
Page 16 of 30
而#import比起#include的好处就是不会引起交叉编译
12.MVC模式的理解
MVC设计模式思索三种对象:模型对象、视图对象、和控制器对象。模型对象代表特别的学问和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制器对象是应用程序的视图对象和模型对象之间的调解者。
13.线程与进程的区别和联系? 进程和线程都是由操作编制所体会的程序运转的基础单元,编制使用该基础单元完成编制对应用的并发性。
程和线程的主要差别在于它们是不同的操作编制资源管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行途径。线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。你看Windows Mobile,Windows Mobil。但对付一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
14.列举几种进程的同步机制,并比较其优缺点。你知道面试题。
答案:原子操作信号量机制自旋锁管程,会合,分布式编制
进程之间通信的途径
答案:共享存储编制消息传递编制管道:以文件编制为基础
进 程死锁的原因
答案:资源竞争及进程推进秩序作歹
死锁的4个必要条 件
Page 17 of 30
答案:互斥、请求保持、不可剥夺、环路
死锁的处理
答案:鸵鸟策略、预防策略、制止策略、检测与解除死锁
15.堆和栈的区别
管理方式:对付栈来讲,是由编译器主动管理,无需我们手工控制;对付堆来说,开释劳动由程序员控制,容易产生memory leak。申请大小:
栈:在Windows下栈是向低地址扩展的数据布局,是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是编制预先规定好的,在WINDOWS下,栈的大小是2M(也有的说是1M,总之是一个编译时就确定的常数),其他手机开发。如果申请的空间突出栈的糟粕空间时,将提示overflow。因此,能从栈获得的空间较小。
堆:堆是向高地址扩展的数据布局,是不连续的内存区域。这是由于编制是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机编制中有效的虚拟内存。由此可见,堆获得的空间比较灵活,也比较大。
碎片问题:对付堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对付栈来讲,则不会存在这个问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行开释,对于Android开发。无需我们手工完成。
Page 18 of 30
分配效率:栈是机器编制提供的数据布局,计算机会在底层对栈提供接济:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。堆则是C/C++函数库提供的,它的机制是很纷乱的。
16.什么是键-值键途径是什么
模型的本质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键途径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象本质序列。第一个键的
本质是由先前的本质决定的,接下来每个键的值也是绝对付其前面的本质。键途径使您可以以独立于模型
完成的方式指定相关 对象的本质。通过键途径,您可以指定对象图中的一个任意深度的途径,使其指向相
关对象的特定属性。
For examplifierle the key pathpostingdress.streetwould get the value of the
postingdressobject as well asn determine thestreet property relative to the
postingdress object.
17.c和obj-c如何混用
1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码,处理mm文件可以识别obj-ccc++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj-c的代码,因为cpp只是cpp
Page 19 of 30
2) 在mm文件中混用cpp直接使用即可,所以obj-c混cpp不是问题
3)在cpp中混用obj- c其实就是使用obj-c编写的模块是我们想要的。 如果模块以类完成,那么要按照cpp class的标准写类的定义,头文件中不能出现obj-c的东西,包括#importcocoa的。面试题解答。完成文件中,即类的完成代码中可以使用obj-c的东西,可以import只是后缀是mm。
如果模块以函数完成,那么头文件要按c的格式声明函数,完成文件中,c++函数外部可以用obj-c,但后缀还是mm或m。
总结:只要cpp文件和cppinclude的文件中不包括obj-c的东西就可以用了,cpp混用obj-c的关键是使用接口,iOS开发。而不能直接使用完成代码,实际上cpp混用的是obj-c编译后的o文件,这个东西其实是无差别的,所以可以用。obj-c的编译器接济cpp.
18.目标-动作机制
目标是动作消息的接收者。一个控件,其他手机开发。或者更为常见的是它的单元,以插座变量(参见"插座变量"局部)
的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而完成的方法。
程序须要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
19.cocoa touch框架
iPhone OS 应用程序的基础 CocoaTouch 框架重用了许多 Mac 编制的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS上完成图形,事件驱动程序的基础工具,其建立在和 Mac OS X 中一样的 Foundation框架上,包括文件处理,网络,字符串操作等。Cocoa Touch 具有和 iPhone用户接口一致的特殊设计。有了 UIKit,您可
Page 20 of 30
以使用 iPhone OS上的独特的图形接口控件,按钮,以及全屏视图的效用,您还可以使用加快仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,CocoaTouch 包括了创建世界一流 iPhone 应用程序须要的所有框架,从三维图形,到专业音效,听听开发。以至提供设备访问 API以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包括只须要几行代码就可以完成全部任务的强大的Objective-C 框架,也在须要时提供基础的 C 言语 API 来直接访问编制。这些框架包括:
Core Animation
通过 CoreAnimation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。
Core Audio
Core Audio是播放,你知道ios。处理和录制音频的专业技术,
com的人员
能够轻松为您的应用程序添加强大的音频效用。
Core Data
提供了一个面向对象的数据管理解决
计划
项目进度计划表范例计划下载计划下载计划下载课程教学计划下载
,它易于使用和理解,以至可处理任何应用或大或小的数据模型。
效用列表:框架分类
下面是 Cocoa Touch 中一小局部可用的框架:
音频和视频
Page 21 of 30
Core Audio
OpenAL
Media Libreast supportry AV Foundation
数据管理
Core Data
SQLite
图形和动画Core Animation
OpenGL ES
Quartz 2D
网络/li>
Bonjour
WebKit
BSD Sockets
用户应用
Address Book
Core Location
Map Kit
Store Kit
20.objc的内存管理
?如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,Windows
Phone。您就拥
有这个对象,须要负责该对象的开释。这个规则在使用NSObject的便利方法new时也同样
适用。
?如果您拷贝一个对象,您也拥有拷贝得到的对象,事实上Windows Phone。须要负责该对象
的开释。
?如果您保持一个对象,您就局部拥有这个对象,须要在不再使用时开释该对象。 反过去,
?如果您从其它对象那里接收到一个对象,则您不拥有该对象,也不应该开释它(这个规则
有少数
Page 22 of 30
的例外,在参考文档中有显式的说明)。
21.主动开释池是什么如何劳动
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对象的一个引用放入到最新的主动开释池。它仍然是个正当的对象,因此主动开释池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置时,主动开释池就会被开释,池中的所有对象也就被开释。
1.ojc-c是通过一种"referring counting"(引用计数)的方式来管理内存的对象在开始分配内存(alloc)的时期引用计数为一以后每当碰到有copyretain的时期引用计数都会加一每当碰到release和autorelease的时期引用计数就会减一如果此对象的计数变为了0 就会被编制销毁.
2. NSAutoreleasePool 就是用来做引用计数的管理劳动的这个东西一般不用你管的. 3.autorelease和release没什么区别只是引用计数减一的时机不同而已autorelease会在对象的使用真正结束的时期才做引用计数减一.
22.类工厂方法是什么类工厂方法的完成是为了向客户提供方便,它们将分配和初始化合在一个步骤中,返回被创建的对象,并
进行主动开释处理。这些方法的形式是+ (type)className...(其中className不包括任何前缀)。
工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以为初始化过程提供对
象的分配信息。
类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽然init...方法可以确认一
个类在每次程序运转过程只存在一个实例,但它须要首先分配一个“生的”实例,然后还必须开释该实例。你看解答。
工厂 方法则可以制止为可能没有用的对象盲目分配内存。
Page 23 of 30
23.单件实例是什么
Foundation 和 ApplicationKit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileMsome kind ofager和NSWorkspace类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时期,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配和初始化。 单件对象充当控制中心的角色,负责指引或调解类的各种服务。如果类在概念上唯有一个实例(比如 NSWorkspace),就应该产生 一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可
以使用单件实例机制,而不是工厂方法或函数。
24.动态绑定
—在运转时确定要调用的方法
动态绑定将调用方法的确定也推迟到运转时。在编译时,方法的调用并不和代码绑定在一起,唯有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运转时因子负责确定消息的接收者和被调用的方法。运转时的消息分发机制为动态绑定提供接济。当您向一个动态类型确定了的对象发送消息时,运转环境编制会通过接收者的isa指针定位对象的类,并以此为起点确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C代码中做任何劳动,就可以主动获取动态绑定的好处。您在每次发送消息时,特别是当消息的接收者是动态类型已经确定的对象时,你知道iOS开发。动态绑定就会例行而透明地发生。
25.obj-c的优缺点
objc优点:
Page 24 of 30
1)Cateogies
2)Posing
3) 动态识别
4)指标计算
5)弹性讯息传递
6) 不是一个过度纷乱的 C 衍生言语
7) Objective-C 与 C++可混合编程
缺点:
1)不支援命名空間
2)不接济运算符重载
3)不接济多重继承
4)使用动态运转时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。iPhone。(如内联函数等),性能低劣。
26.sprintfstrcpymemcpy使用上有什么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char*dst const char *src);
将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为'\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝效用的函数有memcpy,这是一个内存拷贝函数,它的函数原型为memcpy(char *dst const char* src
unsigned intlen);
将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但是会有内存叠加的问题。
sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,Android开发。造成溢出。
Page 25 of 30
27. 用变量a给出下面的定义
a) 一个整型数(Aninteger)b)一 个指向整型数的指针( A pointer to some kind
ofinteger)
c)一个指向指针的的指针,它指向的指针是指向一个整型数( A pointer to a pointer to some kind ofintege)r
d)一个有10个整型数的数组( An assortment of 10integers)
e) 一个有10个指针的数组,该指针是指向一个整型数的。(An assortment of 10
pointers tointegers)
f) 一个指向有10个整型数数组的指针( A pointer to some kind of assortment of 10integers)
g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数(A pointer to a
function that takessome kind of integer as some kind of argument some kind ofd returns some kind ofinteger)
h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型
数( An assortment of tenpointers to functions t
hat take some kind of integer argument some kind ofd return some kind of integer)
答 案是:
a) int a; // Aninteger
b) int *a; // A pointer to some kind ofinteger
c) int **a; // A pointer to a pointer to some kind ofinteger d) int a[10]; // An assortment of 10integers
e) int *a[10]; // An assortment of 10 pointers tointegers f) int (*a)[10]; // A pointer to some kind of assortment of 10integers g) int (*a)(int); // A pointer to a function athattakes some kind of integer argument some kind ofd returns some kind ofinteger
h) int (*a[10])(int); // An assortment of 10 pointers tofunctionsthat take some
kind of integer argument some kind ofdreturn some kind of integer
Page 26 of 30
28.repostingwrite,repostingonly,assign,retain,copy,nonatomic属性的作用
@property是一个属性访问声明,扩号内接济以下几个属性:
1,getter=getterName,setter=setterName,设置setter与getter的方法名 2,repostingwriterepostingonly,设置可供访问级别
2,assign,看看iOS开发。setter方法直接赋值,不进行 任何retain操作,为了解决原类型与环循引用问题
3,retain,setter方法对参数进行release旧值再retain新值,所有完成都是这个秩序(CC上有相关原料)
4,copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。 5,nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级(我是这么理解的...)。
@synthesizexxx;来完成实际代码
,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
1Objective,C外部的完成2CALayer和View的关系3 http协议,tcp/ip4 UITableView的那些元素是可以自定义的,5 c言语的,定义变量,比如int,在什么情况下,其最大值是不同的6 比较32位平台和64位平台不同7 iphone app为什么会被打回来,如何制止??8 为啥离开团队,
1.针对第一个问题,可以看看下面的教程
Object c研究的比较深入的教程
Page 27 of 30
第6章写的加倍好
KVO/KVC完成机理分析
2.CALayer和View的关系
一个UIView包括CALayer树,CALayer是一个数据模型,听说iPhone。包括了一些用于显示的对象,但本身不用于显示。
CALayer相当于photoshop的一个层,很多动画可以通过设置CALayer来完成。据说有人用CALayer显示图片来播放视频。
Coresome kind ofimation应该是用CAlayer来完成各种动画。
这里有篇博文,介绍的还可以
1.objc是扩充C的面向对象,开发mac osx的编程语言。
2.objc中的减号与加号
?减号表示一个函数、或者方法或者消息的开始(在一个类的实例上被调用和实施) ?加号表示其他的函数可以直接调用这个类中的方法,而不用创建这个类的实例
3.NS开发包
乔布斯的NextStep公司缩写,现今mac os使用NS这套函数库
4.#import作用如同#include,用于声明头文件。
5.nil表示空指针,相当于java的null
6.objc中使用字符串,前面要加上"@",是因为在前面加上"符号",编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。(@是把C的字符串转成
Page 28 of 30
NSString的一个简写)
7.开发objc类,需要创建一个头文件和一个实现文件
?头文件(.h):包含类的实例变量的名称和类型、描述方法参数和返回值类型的方法签名; ?实现文件(.m):包含这些方法的实现代码,以及对别的类不可见的,仅与实现本身相关的局部变量的声明和使用。
8.九宫格解法原理;(右上解法)
左出右写入、右出左写入、上出下写入、下出上写入、重排置下;
9.iphone应用程序的项目基本结构
classes:里面存放object-c类源代码文件(可以创建子文件夹来组织代码); other sources:存放除objective-c类之外的源代码文件;
resources: 包含应用程序中的非代码文件(因为应用程序只能在自己的沙盒中运行,不然找不到);
Frameworks:特殊的库,可以存放库、框架、图像、声音等资源;
Products:包含项目在编译时生成的应用程序(xxx.app);
10.Info.plist文件里的bundle identifier(束标识符)
它是应用程序的唯一标识符,要始终配置,命名格式为:顶级Internet域+.+公司名称+.+应用名称;
11.一个在代码里对nib中对象(UILabel、UITextField等)的引用被称为一个插座变量(outlet),用关键字IBOutlet标明(在头文件里);能够被nib中对象调用的方法称为动作(action),用关键字IBAction标明(在实现文件里)。
12.在实现某个动作或是对象后要对这个动作或是对象后要使用release释放内存。13.IBOutlet
输出口 使用关键字IBOutlet来声明实例变量,并通过这个实例变量来引用nib中的对象;
14.-(IBAction)doSomething:(id)sender
Page 29 of 30
控制某个对象执行某项动作 通过关键字IBAction来声明,通过IBAction告诉interface Builder,此方法是一个操作,且可以被某个控件触发;通常 这个操作接受一个参数,该参数被定义为id,名称被指定为sender.(当需要传参数的时候就通过sender来传递,当不需要传参数的时候sender可以不写的);
15.@property (retain , nonatomic) UILable textArea;
retain是通知编译器向分配给此属性的对象发送一个保留(retain)消息,确保属性的实例变量在被使用过程中不会被从内存中删除;
nonatomic是 创建一个互斥访问,避免读和写不同步(非原子性访问); 通过这个属性声明访问来提高执行的效率;(原子性好比如我们去银行存钱,存进去的时候银行账户就会同时增加相应的数额,有一面失败就都回到原来的状态);
16.内存管理理解
?:程序A里有一段内存被成功申请完成之后,内存计数器就从0变为1 (这个过程是alloc);
?:然后程序B里也要使用这个内存,那么内存计数器从1变为2
(这个过程是retain);
?:紧接着程序A不需要这个内存了,那么程序A就把这个内存计数器减1 (这个过程是release);
?:当系统发现这个内存计数器变为0,那么就调用内存回收程序把这段内存回收(这个过程是dealloc);
17.objc使用消息机制来调用方法,消息就是一个类或者对象可以执行的动作 消息表达式:[对象或者类名字 方法名字:参数序列];
对象或者类名字:接收器,是消息的接收者;
方法名字:参数序列:要发送的消息(要执行的动作);
Page 30 of 30