1、平台相关
a)C语言基础语法
b)OC语法
c)iOS api
2、平台无关
a)多线程
b)数据结构与算法()
c)设计模式
d)网络
--------------2013/10/8 9:46------------------
平台相关:
1.写出float与零比较的if语句
注意:不能用等号比较,!= >= <= 都不行。
#define MIN_FLOAT 0.000001
if (a < MIN_FLOAT && a > 0-MIN_FLOAT){……}
2.如何引用一个已经定义过的全局变量
注意:extern的用法
int g_x;(在其他地方声明)
extern int g_x;(用的时候,告诉编译器,在别的地方声明了)
3.static全局变量与普通变量的区别,局部变量呢,函数?
static全局变量是限定作用域的全局变量。
static函数只能被本文件里的内容使用(相当于私有函数),是限定作用域的全局函数。
C++里头的static函数是相对成员函数而言,其调用对象是类,而不是对象。
C++在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
C++在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
4.队列和栈的区别
队列:先进先出
栈:先进后出
5.写一个单链表,要求可以插入数据和删除单个数据
struct Node{
…...
struct Node *_next;
}
struct Node *g_head;
void insert(struct Node* obj){
struct Node *temp = g_head -> next;
g_head -> next = obj;
obj ->next = temp;
};
void remove(struct Node *obj){
struct Node *temp = g_head;
while(temp){
if(temp->next == obj){
temp ->next = obj->next;
free (obj);
}
temp = temp -> next;
}
}
6.指针与引用的区别:引用只是一个变量的别名,本身不占内存空间。指针只是指向另一块内存中的某个变量,本身占内存空间。
引用访问某个对象是直接访问,而指针是间接访问。
引用不能再指向其他变量,而指针可以再指向其他的变量。
引用用指针可以用于信息隐藏
------------------------------------------------------------------------
OC部分
1.__block的概念
考察的是引用传递与值传递的问题。
修饰局部变量,标识这个变量可以被block内部的函数所修改(相当于传进去的是指针)。
成员变量默认是__block 的,临时变量不是。
2.委托代理与通知中心的区别
a)一对一和一对多
b)代理的耦合性高,通知中心的耦合性低
3.实现函数回调的几种方式:
a)委托代理
b)block (如,动画介绍后调用,完成相应的任务)
c)NotificationCenter
d)performSelecter
e)C语言的函数指针 void(*func)();
4.import和include直接的区别
避免重复包含
5.NSAutoReleasePool的实现
将所有的池中对象放到数组中,快速遍历逐一release,再把数组release。
另:对野指针release,对空指针release都是合法的。
6.ARC与非ARC之间的区别(automatic reference counting)(manual reference count)?
a)ARC不能写release、retain、autorelease
b)__weak,__strong,__bridge,__autoreleasing
__strong:会retain(强引用)
__weak NSObject *obj;和assign类似,多一个功能:对象销毁后置为nil
__autoreleasing:使对象延迟释放
__bridge:忽略所有的内存管理细节
Core Foundation需要使用桥接,
不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])
7.如何实现ARC与非ARC混合编译
添加标签的方法:
- 打开:你的target -> Build Phases -> Compile Sources.
- 双击对应的 *.m 文件
- 在弹出窗口中输入上面提到的标签 -fobjc-arc / -fno-objc-arc
- 点击 done 保存
a)-fno-bojc-arc 在ARC的环境下,指定某些源文件以非ARC的方式编译
b)-fobjc-arc 在非ARC下,指定某些源文件以ARC的方式编译。
8.ARC实现原理
在程序预编译阶段,将ARC的代码转换为非ARC的代码,自动加入retain,release,autorelease这些用于内存管理的方法。
9.强引用与弱引用
引用就是一个对象A包含另一个对象B,强引用会对B引用计数加1,弱引用不会加1。
应用场景:大部分情况下我们都使用强引用,为了防止循环强引用我们会使用弱应用。一般设置代理,我们用弱引用。
10.深拷贝和浅拷贝
深拷贝会开辟一块内存空间,而浅拷贝只是复制指向对象的指针。
大部分情况下我们都是使用浅拷贝,特殊的应用需求才会用深拷贝。
11.OC中集合类:
NSSet、NSArray。一般我们使用后者。
12.OC中没有多继承,如果一定要实现可以用协议,或者是扩展。
13.用OC写两个线程,对同一个变量分别进行+、-操作。
答:
线程同步,@synchronized枷锁。或者在property里面加锁(atomic,retain)
14.扩展,类别,继承三者之间的关系。
答:
在面向对象编程时,我们经常需要为现有的类添加一些新的功能(行为),通常我们采用创建子类的方法。但有时候创建子类并不方便,你用到的工具集和库可能无法处理新的对象。比如,NSString类,如果创建子类,那么类方法 stringWithFormat就无法返回。
而利用OC动态运行时动态分配的机制,可以为现有的类添加新的方法。类别是一种为现有的类添加新方法的方式。对现有的类,或以前的代码的使用没有影响,兼容性非常好。不过,类别也有缺陷:1.无法向类中添加新的实例变量,2.命名冲突,当发生命名冲突时,类别具有更高的优先级,导致原始的方法不可以使用。解决办法:在类别方法前加前缀。
类别的优点:1.将类的实现代码分散到不同的文件或者框架中,2.将对私有方法的前向引用,3.想对象添加非正式协议。
类扩展:1.不需要名字,2.可以添加实例变量,3.修改实例变量的读写权限。
三者都是对某个类的扩展或改写。
自己写代码,一般用的最多的还是继承。
15.如何创建一个线程,要求可以一直工作,不会执行一次就结束。
@synthesize name;
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSThread *thread = [[NSThread alloc]initWithTarget:self selector:@selector(threadFunc) object:nil];
[thread start];
}
static bool over = NO;
- (void)threadFunc
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
while (YES) {
@synchronized(name){
name = @"Frank";
[NSThread sleepForTimeInterval:2];
if ([NSThread isMultiThreaded]) {
NSLog(@"%@ isMultiThreaded",name);
}
if (over) {
break;
}
}
}
[pool release];
}
16.结束一个线程:
a)break;
b)[thread cancel]