iphone 面试题
1.main()
{ int a[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是数组指针,其类型为 int (*)[5]; a,&a的地址是一样的,但意思不一样
2. 以下为Windows NT下的32位C++程序,请计算sizeof的值
这题 很常见了,Func ( char str[100] )函数中数组名作为函数形参时,在函数体内,数组名失去了本身的内涵,仅仅只是一个指针;在失去其内涵的同时,它还失去了其常量特性,可以作自增、自减等 操作,可以被修改。Windows NT 32位平台下,指针的长度(占用内存的大小)为4字节,故sizeof( str ) 、sizeof ( p ) 都为4。
3.还是考指针,不过我对cocoa的代码还是不太熟悉 大概是这样的 - (void)*getNSString(const NSString * inputString) { inputString = @"This is a main test\n"; return ; } -main(void) {
NSString *a=@"Main";
NSString *aString = [NSString stringWithString:@"%@",getNSString(a)];
NSLog(@"%@\n", aString); }
最后问输出的字符串:NULL,output在 函数返回后,内存已经被释放。
4.用预处理指令#define声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
写一个"
结果是:
5.写一个委托的 interface
@protocol MyDelegate;
@interface MyClass: NSObject { id <MyDelegate> delegate; }
// 委托方法 @protocol MyDelegate - (void)didJobs:(NSArray *)args; @end 6. 写一个NSString类的实现 + (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding; + (id) stringWithCString: (const char*)nullTerminatedCString obj = [self allocWithZone: NSDefaultMallocZone()]; 7.obj-c有多重继承么?不是的话有什么替代方法?
多继承在这里是用protocol 委托代理 来实现的
8.obj-c有私有方法么?私有变量呢
objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整的面向对象了,按照OO的原则就是一个对象只暴露有用的东西. 如果没有了私有方法的话, 对于一些小范围的代码重用就不那么顺手了. 在类里面声名一个私有方法 @interface Controller : NSObject { NSString *something; } + (void)thisIsAStaticMethod; - (void)thisIsAnInstanceMethod; @end @interface Controller (private) - (void)thisIsAPrivateMethod; @end
@private可以用来修饰私有变量 在Objective‐C中,所有实例变量默认都是私有的,所有实例方法默认都 是公有的 9.关键字const有什么含意?修饰类呢?static的作 用,用于类呢?还有extern c的作用
const 意味着"只读",下面的声明都是什么意思?
前两个的作用是一样,a是一个常整型数。第三个意味着a是一个指向常整型数的指 针(也就是,整型数是不可修改的,但指针可以)。第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改 的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的)。
结论: ?; 关键字const的作用是为给读你代码的人传达非常有用的信息,实际上,声明一个参数为常量是为了告诉了用户这个参数的应用目的。如果 (1)欲阻止一个变量被改变,可以使用 const 关键字。在定义该 const 变量时,通常需要对它进行初 关键字volatile有什么含意?并给出三个不同的例子。
一个定义为 volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到 ?; 并行设备的硬件寄存器(如:状态寄存器)
?; 一个参数既可以是const还可以是volatile吗?解释为什么。
static 关键字的作用:
(1)函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次, extern "C" 的作用
(1)被 extern "C"限定的函数或变量是 extern 类型的; extern 是 C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器, (2)被 extern "C"修饰的变量和函数是按照 C 语言方式编译和连接的;
extern "C"的惯用法 (1)在 C++中引用 C 语言中的函数和变量,在包含 C 语言头文件(假设为 cExample.h)时,需进 (2)在 C 中引用 C++语言中的函数和变量时,C++的头文件需添加 extern "C",但是在 C 语言中不 10.为什么标准头文件都有类似以下的结构? 显然,头文件中的编译宏“#ifndef __INCvxWorksh、#define __INCvxWorksh、#endif” 的作用
11.#import跟#include的区别,@class呢?
@class一般用于头文件中需要声明该类的某个实例变量的时候用到,在m文 件中还是需要使用#import 而#import比起#include的好处就是不会引起交叉编译 12.MVC模式的理解 MVC设计模式考虑三种对象:模型对象、视图对象、和控制器对象。模型对象代表 特别的知识和专业技能,它们负责保有应用程序的数据和定义操作数据的逻辑。视图对象知道如何显示应用程序的模型数据,而且可能允许用户对其进行编辑。控制 器对象是应用程序的视图对象和模型对象之间的协调者。 13.线程与进程的区别和联系? 进程和线程都是由操作系统所体会的程序运行的基本 单元,系统利用该基本单元实现系统对应用的并发性。 程和线程的主要差别在于它们是不同的操作系统资源 管理方式。进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。线程有自己的堆栈和局部变 量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一 些。但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
14.列举几种进程的同步机制,并比较其优缺点。 答案: 原子操作 信号量机制 自旋锁 管程,会合,分布式系统 答案:共享存储系统消息传递系统管道:以文件系统为基础 答案:资源竞争及进程推进顺序非法 答案:互斥、请求保持、不可剥夺、环路 答案:鸵鸟策略、预防策略、避免策略、检测与解除死锁 15.堆和栈的区别 管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memory leak。 申请大小: 碎片问题:对于堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。对于栈来讲,则不会存在这个 问题,因为栈是先进后出的队列,他们是如此的一一对应,以至于永远都不可能有一个内存块从栈中间弹出 分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。动态分配由 alloca函数进行分配,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行释放,无需我们手工实现。 分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的 效率比较高。堆则是C/C++函数库提供的,它的机制是很复杂的。
16.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键 来查找相应的属性值。在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性 质序列。第一个键的
For example, the key path address.streetwould get the value of the address property from the receiving object, and then determine the street property relative to the address object. 17.c和obj-c如何混用 1)obj-c的编译器处理后缀为m的文件时,可以识别obj-c和c的代码, 处理mm文件可以识别obj-c,c,c++代码,但cpp文件必须只能用c/c++代码,而且cpp文件include的头文件中,也不能出现obj- c的代码,因为cpp只是cpp 18.目标-动作机制
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参 见"插座变量"部分) 动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现 的方法。 程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。 19.cocoa touch框架 iPhone OS 应用程序的基础 Cocoa Touch 框架重用了许多 Mac 系统的成熟模式,但是它更多地专注于触摸的接口和优化。UIKit 为您提供了在 iPhone OS 上实现图形,事件驱动程序的基本工具,其建立在和 Mac OS X 中一样的 Foundation 框架上,包括文件处理,网络,字符串操作等。
Cocoa Touch 具有和 iPhone 用户接口一致的特殊设计。有了 UIKit,您可以使用 iPhone OS 上的独特的图形接口控件,按钮,以及全屏视图的功能,您还可以使用加速仪和多点触摸手势来控制您的应用。
各色俱全的框架 除了 UIKit 外,Cocoa Touch 包含了创建世界一流 iPhone 应用程序需要的所有框架,从三维图形,到专业音效,甚至提供设备访问 API 以控制摄像头,或通过 GPS 获知当前位置。Cocoa Touch 既包含只需要几行代码就可以完成全部任务的强大的 Objective-C 框架,也在需要时提供基础的 C 语言 API 来直接访问系统。这些框架包括: Core Animation 通过 Core Animation,您就可以通过一个基于组合独立图层的简单的编程模型来创建丰富的用户体验。 Core Audio Core Audio 是播放,处理和录制音频的专业技术,能够轻松为您的应用程序添加强大的音频功能。 Core Data 提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚至可处理任何应用 或大或小的数据模型。 功能列表:框架分类下面是 Cocoa Touch 中一小部分可用的框架:
20.objc的内存管理
? 如果您通过分配和初始化(比如[[MyClass alloc] init])的方式来创建对象,您就拥 21.自动释放池是什么,如何工作
当您向一个对象发送一个autorelease消息时,Cocoa就会将该对 象的一个引用放入到最新的自动释放池。它仍然是个正当的对象,因此自动释放池定义的作用域内的其它对象可以向它发送消息。当程序执行到作用域结束的位置 时,自动释放池就会被释放,池中的所有对象也就被释放。 1. ojc-c 是通过一种"referring counting"(引用计数)的方式来管理内存的, 对象在开始分配内存(alloc)的时候引用计数为一,以后每当碰到有copy,retain的时候引用计数都会加一, 每当碰到release和autorelease的时候引用计数就会减一,如果此对象的计数变为了0, 就会被系统销毁. 22.类工厂方法是什么 类工厂方法的实现是为了向客户提供方便,它们将分配和初始化合在一个步骤中, 返回被创建的对象,并 工厂方法可能不仅仅为了方便使用。它们不但可以将分配和初始化合在一起,还可以 为初始化过程提供对 类工厂方法的另一个目的是使类(比如NSWorkspace)提供单件实例。虽 然init...方法可以确认一
23.单件实例是什么 Foundation 和 Application Kit 框架中的一些类只允许创建单件对象,即这些类在当前进程中的唯一实例。举例来说,NSFileManager 和NSWorkspace 类在使用时都是基于进程进行单件对象的实例化。当向这些类请求实例的时候,它们会向您传递单一实例的一个引用,如果该实例还不存在,则首先进行实例的分配 和初始化。 单件对象充当控制中心的角色,负责指引或协调类的各种服务。如果类在概念上只有一个实例(比如 24.动态绑定 —在运行时确定要调用的方法
动态绑定将调用方法的确定也推迟到运行时。在编译时,方法的调用并不和代码绑定 在一起,只有在消实发送出来之后,才确定被调用的代码。通过动态类型和动态绑定技术,您的代码每次执行都可以得到不同的结果。运行时因子负责确定消息的接 收者和被调用的方法。 运行时的消息分发机制为动态绑定提供支持。当您向一个动态类型确定了的对象发送消息时,运行环境系统会通过接收者的isa指针定位对象的类,并以此为起点 确定被调用的方法,方法和消息是动态绑定的。而且,您不必在Objective-C 代码中做任何工作,就可以自动获取动态绑定的好处。您在每次发送消息时,
25.obj-c的优缺点
objc优点: 3) 不支持多重继承 4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。
26.sprintf,strcpy,memcpy使用上有什 么要注意的地方
strcpy是一个字符串拷贝的函数,它的函数原型为strcpy(char *dst, const char *src); 将src开始的一段字符串拷贝到dst开始的内存中去,结束的标志符号为 '\0',由于拷贝的长度不是由我们自己控制的,所以这个字符串拷贝很容易出错。具备字符串拷贝功能的函数有memcpy,这是一个内存拷贝函数,它的函 数原型为memcpy(char *dst, const char* src, unsigned int len); 将长度为len的一段内存,从src拷贝到dst中去,这个函数的长度可控。但 是会有内存叠加的问题。 sprintf是格式化函数。将一段数据通过特定的格式,格式化到一个字符串缓 冲区中去。sprintf格式化的函数的长度不可控,有可能格式化后的字符串会超出缓冲区的大小,造成溢出。 27. 用变量a给出下面的定义 a) 一个整型数(An integer) 28.readwrite,readonly,assign,retain,copy,nonatomic 属性的作用 @property是 一个属性访问声明,扩号内支持以下几个属性:
*********************************
1Objective-C内部的实现
2CALayer和View的关系
3 http协议,tcp/ip
4 UITableView的那些元素是可以自定义的?
5 c语言的,定义变量,比如int,在什么情况下,其最大值是不同的
6 比较32位平台和64位平台不同
7 iphone app为什么会被打回来,如何避免??
8 为啥离开团队?
1.针对第一个问题,可以看看下面的教程 Object c研究的比较深入的教程 第6章写的尤其好
KVO/KVC 实现机理分析 http://archive.cnblogs.com/a/1886332/
2.CALayer和View的关系
一个UIView包含CALayer树,CALayer是一个数据模型,包含了一些用于显示的对象,但本身不用于显示。 CALayer相当于photoshop的一个层,很多动画可以通过设置CALayer来实现。据说有人用CALayer显示图片来播放视频。 Core animation应该是用CAlayer来实现各种动画。 这里有篇博文,介绍的还可以http://www.cnblogs.com/uyoug321/archive/2011/01/22.html |