原文:http://blog.sina.com.cn/s/blog_aeb8e4450101blmp.html
1、OC
OC
OC
OC
2、以下命名正确的是
(1)类 (Person、person、ObjectAndKeys、personAndOther) (2)对象 (objectAndKeys、Person、_person、$dog) (3)实例变量 (_dog、^age、name、Name、)
3、数据类型和表达式
(1)
答:result
(2)result =
答:运算符号相同,因此判断运算符号的结合性。即表达式为:result =
(3)int a = 5, b = 12, c = 3, result = 0, d = 5, e = 2,result = a -= b /= c += d %= e;求result,a、b、c、d、e。
答:运算符号相同,因此,判断该运算符号的结合性。赋值运算符号为右结合, 因此,表达式从右开始计算。d %= 2,分解为
(4)如果第三题中
c、d、e
(5)假设
答:result
答:任意类型对象。程序运行时决定才对象的类型。 (7)解释
答:不会,在
4、流程控制语句
(1)switch
答:switch
添加的。如果在某一个条件中添加(case
(2)do while
答:do while语句至少执行一次循环体,而while语句括号中的表达式为真, 才执行循环体。
while(1){ }、for(;)
(3)switch
答:均表示条件的判断,switch
(4)int number = 26,k = 1,求
do {
k *= number % 10;
number /= 10;
} while(number);
答:do while
5、写出以下方法类型、方法名称和返回值类型
(1)-(void)initWithName:(NSString *)name andAge:(int)
(2)+(Person *)personName:(NSString)name; (3)-(void)setName:(NSString *)name setAge:(int)age setDelegate:(id)delegate;
(4)-(NSString *)name;
(5)+
6、创建一个这样的
.h文件
#import @”Person.h”
@protocol PersonDelegate @required
- (void)thisRequiredMethod;
@optional
- (void)thisOptionalMethod; @end
@interface Person : NSObject { @private
NSString *_name;
NSInteger _age; }
-
-
(void)test; -
-
(void)test1:(int)arg1; -
-
(void)test1:(int)arg1 test2:(int)arg2; @end @interface Person (Create)
- (id)initWithName:(NSString *)aName;
- (id)initWithName:(NSString *)aName age:(int)age; + (id)personBorn;@end
.m文件
@interface Person () - (void)private1;
- (void)private2; @end @implementation
- (void)test {}
- (void)test1:(int)arg1 {}
- (void)test1:(int)arg1 test2:(int)arg2 {} - (void)private1 {}
- (void)private2 {}
- (id)initWithName:(NSString *)aName { self = [super init];
if (self) {
}
return self;
}
- (id)initWithName:(NSString *)aName age:(int)age {
...... }
+ (id)personBorn {
Person *person = [[Person alloc] init]; return [person autorelease];
} @end
7、协议的基本概念和协议中方法默认为什么类型
答:OC
而是又其他人来实现。协议经常用来实现委托对象(委托设计模式)。 如果一个类采用了一个协议,那么它必须实现协议中必须需要实现的方法,在 协议中的方法默认是必须实现(@required),添加关键字@optional,表明一旦
采用该协议,这些“可选”的方法是可以选择不实现的。
8、#include
答:#include
9、@public、@protected、@private
(
(
(
(4)通过指针运算符(->)能够访问到
答:不可以,可以通过合成存取器访问实例变量,也可自己定义
10、简述类目优点和缺点,如果覆盖本类或者父类的方 法,会出现什么问题?
答:(1)优点:不需要通过增加子类而增加现有类的行为(方法),且类目中 的方法与原始类方法基本没有区别;通过类目可以将庞大一个类的方法进行划分, 从而便于代码的日后的维护、更新以及提高代码的阅读性。
(2)缺点:无法向类目添加实例变量,如果需要添加实例变量,只能通过 定义子类的方式;类目中的方法与原始类以及父类方法相比具有更高级别的优先 级,如果覆盖父类的方法,可能导致
11、简述内存管理基本原则
答:(1)如果使用
(2)向一个对象发送一条
(3)向一个对象发送
12、在
移动终端中,是不支持
答:ARC
是在IOS 5之后推出的新技术,它与GC的机制是不同的。我们在编写代码时, 不需要向对象发送release
14、什么是
答:每一个对象都默认有一个
个实例正在引用它。当它为
@synthesize person
非原子性事物
-
-
(void)setPerson:(Person *)person { if
(_person != person){ [_person release]; _person = [person retain]; } }
-
-
(Person *)person { return _person; }
原子性事物
-(void)setPerson:(Person *)person {
@synchronized(self) {if
(_person != person){
[_person release]; _person = [person retain]; }
} }
- (Person *)person {
@synchronized(self) {
return _person; }
}
16、深、浅复制的基本概念以及他们的区别,可以用图 来加以说明。
17、堆和栈的区别
答:(1)栈区(stack)由编译器自动分配释放 ,存放方法(函数)的参数值, 局部变量的值等。先进后出。
(2)堆区(heap)一般由程序员分配释放, 若程序员不释放,程序结束 时由OS回收 。
(3)全局区(静态区)(static),全局变量和静态变量的存储是放在一块 的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始 化的静态变量在相邻的另一块区域。程序结束后有系统释放。
(4)文字常量区—常量字符串就是放在这里的。程序结束后由系统释放。 (5)程序代码区—存放函数体的二进制代码。
18、用户自定义了一个对象,如何实现拷贝(可变和不 可变拷贝)
答:必须实现
- (id)copyWithZone:(NSZone *)zone
{
Person *person = [[self Class] allocWithZone:zone]; person ->age = self.age;
person ->name = self.name;
return person;
}
- (id)mutableCopyWithZone(NSZone *)zone;
19、以下代码有问题吗?如果有,会出现什么问题
- (void) setName:(NSString *)name {
self.name = name; }
答:引起重复调用(自己调用自己)。
20、定义属性时,什么时候用
答:(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式, 以此来防止循环引用。(我们称之为弱引用,weak)
(2)retain:保留计数,获得到了对象的所有权。引用计数在原有基础上 加1。
(3)copy:一般认为,是在内存中重新开辟了一个新的内存空间,用来
存储新的对象,和原来的对象是两个不同的地址,引用计数分别
21、解释以下关键字,static、self、super
答
self:当前消息的接收者。
22、解释
答:容错处理,当父类初始化失败,会返回一个
23、当我们释放对象时,为什么需要调用[super dealloc]
答:(1)因为,子类是继承自父类,那么子类中有一些实例变量(对象),是 继承子父类的,因此,我们需要调用父类方法,将父类所拥有的实例进行释放。
(2)先将子类所拥有的实例进行释放,然后再释放父类的。
答:是有的,我们称之为延展。私有变量也是有的(@private)。
别是多少?
Person *person = [[Person alloc] init]; // 1
[person retain]; [person release]; [person release];
// 2 // 1
// 0
26、在某个方法中
答:是有区别的,前者是存在内存管理的,它会对_name
27、假设我们写了一个类的合成存取器,@property (nonatomic, copy) NSString *name;@synthesize name;
(1)NSString *aName = [NSString stringWithFormat:@”a”];
person.name = aName
有什么好处?
答:它的引用技术是
(2)NSMutableString*aName = [NSMutableString stringWithFormat:@”a”];
答:它的引用技术是
答:不可变,因为合成存取器中用的
28、自动释放池是什么,如何工作
答:自动释放池是
不会销毁,而是池子中的临时对象都被发送
的?
30、iOS
31、对象归档的基本概念,以及它的特点是什么?
答:归档为对象的数据持久化提供了一种解决方法,它特点是给归档的对象进 行加密,增强了数据的安全性。此外,自定义类的对象归档必须实现
32、什么是谓词?
答:cocoa
每一个对象通过谓词进行筛选,判断条件是否匹配。
33、什么是
答:(1)KVC(键值编码)是一种间接访问对象实例变量的机制,该机制可以 不通过存取方法就可以访问对象的实例变量。非对象类型的变量将被自动封装或 者解封成对象。此外,使用
(2)KVO(键值观察)是一种能使得对象获取到其他对象属性变化的通知
机制。
(3)实现
改它的实例变量,这样才能被观察者观察到。因此,KVC
34、在
答:(1)注册观察者(这里我们需要注意,观察者和被观察者不会被保留也不 会被释放)
- (void)addObserver:(NSObject *)observer forKeyPath:(NSString *)keyPath
options:(NSKeyValueObservingOptio
context:(void *)context;
(2)接收变更通知
- (void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object change:(NSDictionary *)change context:(void *)context;
(3)移除对象的观察者身份
- (void)removeObserver:(NSObject *)observer
forKeyPath:(NSString *)keyPath;
35、当我们释放我们的对象时,为什么需要调用[super dealloc]方法,它的位置又是如何的呢?
答:因为子类的某些实例是继承自父类的,因此需要调用[super dealloc]方法, 来释放父类拥有的实例,其实也就是子类本身的。一般来说我们优先释放子类拥 有的实例,最后释放父类所拥有的实例。
36、以下代码会出项问题吗?如果有,我们又该如何修 改?
@property (nonatomic, copy) NSMutableString *name; @synthesize name = _name;
self.name = [NSMutableString stringWithFormat:@"..xyz"]; [self.name insertString:@"abc" atIndex:0];
答:不可变字符串不可以被修改,可以通过自定义
37、当我们将一个对象加入自动释放池时,该对象何时 被销毁
答:我们在
38、当我们调用一个静态方法时,需要对对象进行
答:不需要,静态方法(类方法)创建一个对象时,对象已被放入自动释放池。 在池被释放时,很有可能被销毁。
39、什么叫键路径?
答:在一个给定的实体中,同一个属性的所有值具有相同的数据类型。 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对 象性质序列。第一个键的性质是由先前的性质决定的,接下来每个键的值也是相
对于其前面的性质。键路径使您可以以独立于模型实现的方式指定相关对象的性 质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对 象的特定属性。
40、以下代码存在内存泄露吗?如果有,如何去修改
self.object = [NSObject alloc] init]; self.object = [NSObject object] retain]; self.object = [NSObject object];
- (void)dealloc {
self.object = nil;
[super dealloc]; }
41、循环引用是什么,如何解决这样的问题
答:对象
当
b
这种情况,必须打断循环引用,通过其他规则来维护引用关系。我们常见的
42、isMemberOfClass
isKindOfClass
如
二、常见
1、
三、常见
答:(1)视图控制器的装载:当视图控制器从
调用父类的
图所拥有的对象销毁。
2、什么是响应事件者链
答:当
3、简述
答:表视图的重用机制是一种节约设备内存的机制,尤其是需要显示大量数据 时,显得尤其重要。当我们开始创建表视图的一行时,首先定义一个静态的字符 串作为单元格的标识符,然后通过该标识符去检测该表视图中有没有闲置的单元 格,如果没有,我们就创建一个新的单元格,并且给它指定一个标识符。如果已 有闲置的单元格,则直接从表视图中取出来,给单元重新赋上新的值。初学者容 易犯的错误时,当我需要自定义一个单元格时,将自定义实例创建在“括号”外, 这样单元格中会出现重叠现象,这是初学者常见的错误。此外,如果当前表视图 显示
4、代理、通知和
答:代理是一种回调机制,且是一对一的关系,而通知是一对多的关系,一个 中心对象向所有的观察者提供变更通知(KVO
5、如何适配
答:iPhone5
用宏定义获取设备的尺寸,减少程序中的硬编码。
#define iPhone5 ([UIScreen instancesRespondToSelect
6、线程和进程的区别
答:线程是进程的一部分,进程是程序的一部分。
进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生 影响,而线程只是一个进程中的不同执行路径。
线程有自己的堆栈和局部变量,主线程死掉就等于整个进程死掉。所以多进程 的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。 但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能 用进程。
7、什么是
答:M
8、bounds
9、如何发起一个
//
NSURL *url = [NSURL URLWithString:@"http://www.taobao.com"]; //
NSURLRequest *request = [NSURLRequest requestWithURL:url]; NSURLResponse *response;
//
NSData *resultData = [NSURLConnection sendSynchronousRequest:request
returningResponse:&response NSString *datastring = [[NSString alloc] initWithData:resultData
encoding:NSUTF8StringEncoding]; self.resultText.text = datastring;
(2)异步请求
NSURL *url = [NSURL URLWithString:request_url];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
//
[NSURLConnection connectionWithRequest:request
delegate:self];
//
- (void)connection:(NSURLConnection *)connection
didReceiveData:(NSData *)data { [_data appendData:data];
}
//
- (void)connectionDidFinishLoadi
NSString *datastring = [[NSString alloc] initWithData:_data
encoding:NSUTF8StringEncoding]; self.resultText.text = datastring;
}
error:nil];
大家详见课件。
10、多线程的基本概念,在
答:NSThread、block
答:Run loops
12、网络数据传输一般有几种格式,他们有哪些区别, 你又用的哪些框架进行解析的
答:JSON、XML;
JSON:JSON(JavaScript Object Notation)
1、对象是一个无序的“‘名称/值’对”集合。一个对象以“{”开始,以“}” 结束。每个“名称”后跟一个“:”,“‘名称/值’对”之间使用“,”分隔。
2、数组是值(value)的有序集合。一个数组以“[”开始,“]”结束。值之间 使用“,”分隔。
XML:可扩展标记语言(extensible Markup Language,简称:XML),是一种标 记语言。XML
13、Dom
答:DOM即Document Object Model,中文叫文档对象模型。
SAX即Simple API for XML的简称,中文叫XML简单应用程序接口。
Dom
耗费内存资源,因为它是一次性将
14、CALayer
答:通常会将
15、cocoa touch
iPhone OS
UIKit
Cocoa Touch
各色俱全的框架 除了
甚至提供设备访问
Cocoa Touch
Core Animation:通过
Core Audio:Core Audio
Core Data:提供了一个面向对象的数据管理解决方案,它易于使用和理解,甚 至可处理任何应用或大或小的数据模型。
功能列表:框架分类
下面是
音频和视频:Core Audio
图形和动画 :Core Animation
用户应用:Address Book
16、将变量保存到本地,列举两个简单的方法
答:使用
本地,需要实现
答:参考真机调试流程一文
18、远程推送通知的基本流程
19、如何发布我们的应用程序
答:参考真机调试的流程,将程序打包成一个发布的包,最后使用使用
可参考:http://mobile.51cto.com/iphone-280746.htm
答:调用
21、以下函数主要完成什么事情?
UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]))
答:这个函数被调用的主入口点创建应用程序的对象和应用程序委托和事件循 环。注意这个函数虽有返回值,但这个函数在程序没有结束时,永远不会返回。
22、用过什么内存优化管理工具
23、iOS
答:audio(音频播放)、location(位置服务)、voip(网络电话),在
一般自定义的后台任务只能执行
600s,见以下代码,详见课件。
UIApplication*application = [UIApplication sharedApplication]; bgTask=[application
beginBackgroundTaskWithE
[application endBackgroundTask:bgTask];
bgTask = UIBackgroundTaskInvalid; }];
}
24、iPhone4
答:一般情况下为需要为
iPad
大小(像素) | 文件名 |
用途 |
重要度 |
512*512 | —— | iTunes | 推荐有 |
1024*1024 | —— | iTunes | 推荐有 |
72*72 | Icon-72.png | App store\home | 必须有 |
144*144 | Icon-72@2x.png | App store\home | 推荐有 |
50*50 | Icon-Small-50.png | Setting、Spotlight | 推荐有 |
100*100 | Icon-Small-50@2x.png | Setting、Spotlight | 推荐有 |
768*1004 | Default-Portrait.png | 启动页竖屏 | 推荐有 |
1536*2008 | Default-Portrait@2x.png | 启动页竖屏 | 推荐有 |
748*1024 | Default-Landscape.png | 启动页横屏 | 推荐有 |
1496*2048 | Default-Landscape@2x.png | 启动页横屏 | 推荐有 |
iPhone
大小(像素) | 文件名 |
用途 | 重要度 |
57*57 | Icon.png |
App store\home | 必须有 |
114*114 | Icon@2x.png | App store\home | 推荐有 |
29*29 | Icon-Small.png |
Setting、Spotlight | 推荐有 |
58*58 | Icon-Small@2x.png | Setting、Spotlight | 推荐有 |
320*480 | Default.png |
启动页 | 推荐有 |
640*960 | Default @2x.png | 启动页 | 推荐有 |
640*1136 | Default-568h@2x.png |
iPhone5 | 推荐有 |
http://developer.apple.com/library/ios/#documentation/userexperience/conc eptual/mobilehig/IconsImages/IconsImages.html
25、什么是沙盒,文档目录结构的作用
答:IOS
Documents
AppName.app
Library
Preferences
Caches
tmp
获取这些目录路径的方法:
1,获取家目录路径的函数:
NSString *homeDir = NSHomeDirectory();
2,获取
NSArray *paths = NSSearchPathForDirectori
NSString *docDir = [paths objectAtIndex:0];
3,获取
NSArray *paths = NSSearchPathForDirectori
NSString *cachesDir = [paths objectAtIndex:0];
4,获取
NSString *tmpDir = NSTemporaryDirectory(); 5,获取应用程序程序包中资源文件路径的方法: 例如获取程序包中一个图片资源(apple.png)路径的方法:
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@”apple” ofType:@”png”];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];
26、http
答:http
求方式为客户端主动发起请求,服务器才能给响应,一次请求完毕后则断开连接, 以节省资源。服务器不能主动给客户端响应(除非采取
scoket
四、常见算法题
1、冒泡排序
int index2 = 0;
for (int index1 = 0; index1 < 12; index1++) {
//
//
int variable = 0;
if (a[index1] < a[index2]) {
variable = a[index1]; a[index1] = a[index2]; a[index2] = variable;
} }
}
2、快速排序
int array[10]={12, 32, 2, 52, 45, 65, 58, 56, 98, 54}, i, j, t;
for(i = 1; i <= 9; i++) {
j = i-1; //
while(j >= 0 && t > array[j]) //
{
j = j-1; }
array[j+1] = t; }
3、插入排序
int i, j;
for (i = 1; i < 12; i++) {
if (a[i] < a[i - 1]) {
array[j+1] = array[j];
//
int temp = a[i]; //
for (j = i - 1; j >= 0 && a[j] > temp; j--) {
a[j + 1] = a[j]; }
a[j + 1] = temp; }
}
//