2-26号面试-
1.obj-c有私有方法么?私有变量呢?
答:
有私有方法,也有私有变量。 在objective-C中,所有实例变量默认都是私有的,所有实例方法默认都是公有的
2.#import跟#include的区别?#import<>跟#import又有什么区别?
答:
1.#import是 Objective-C 导入头文件的关键字,而#include是c#/c++导入头文件的关键字
2.使用#import导入的头文件只会导入一次,不会重复导入
3.#import<>用来引用系统的头文件,#import“”用来引用用户的头文件
3.Object-c的类可以多重继承么?可以实现多个接口么?Category是什么?重写一个类的方式用继承好还是分类好?为什么?
Objective-C不能多继承,可以实现多个接口
运用Category分类去重写一个类的方法,仅对Category有效,不会影响其他类以及原生类
4.Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?
创建线程的三种方法:NSThread,GCD的dispatch,使用子类化的NSOperation,然后将其加入NSOperationQueue
在主线程执行代码的方法:performSelectorOnMainThread
延时执行代码:performSelector:onThread:WithObject:waitUntilDone:
5.浅拷贝和深拷贝的区别?
浅拷贝(retain):指复制指向对象的指针,而不复制引用对象的本身
深拷贝(copy):复制引用对象的本身
6.协议、通知和KVO的区别?
Delegate(协议):比较规范,针对one- to - one(1对1)关系,并且receiver(接受者)可以返回值给sender(传递者)
Notification(通知): 比较灵活,针对one - to - one/many/none(1对多)关系,receiver无法返回值给sender,so,delegate用于sender希望接受到receiver的一个反馈值,notification用于通知多个object某个事件
KVO:性能不好(底层会产生新的类),只能监听某个对象的属性的变化,不推荐使用(1个对象的属性能被多个对象监听, 1个对象能监听多个对象的其他属性)
7.协议与通知的不同:
1.协议有控制链(has-a)的关系,而通知没有
2.通知可以一对多,一条消息可以发送给多个消息接受者
8.strong与weak的区别
1.当一个对象不再有strong类型的指针指向它的时候,它就会被释放,即使还有weak类型指向它
2.一旦最后一个strong类型指针离去,这个对象将被释放,所有的weak类型指针都将被清除
9.何为isa指针
是一个Class类型的指针。
每一个实例对象有个isa指针,指向对象的类,而Class里也有一个isa指针,指向meteClass(元类); 元类保存了类方法的列表。
当类方法被调用时,会先从本身中查找类方法的实现,如果没有,元类会向他的父类查找这个类方法。同时注意的是:元类也是类,也是对象。元类也有isa指针,它的isa指针最终指向一个根元类(rootClass),根元类的isa指针指向本身,这样实现一个封闭的内循环。
2/29面试题
1.请描述数组,链表,堆栈,队列,集合,散列表的特点与常用使用场景
队列,栈是线性数据结构的典型代表,而数组,链表是常用的两种数据存储结构;
队列和栈均可以用数组或链表的存储方式实现它的功能。
HashSet 用HashMap类实现 集合
HashMap 散列表 Entry节点 key value hashvalue next
2.请用伪代码写出计算二叉树深度的算法
2.1,可以用递归方法,
2.2,先根遍历
2.3,递归函数,增加形参,记录当前的根的层。
2.4,找到和结点对应的记录值 。
2.5,返回结点层数
伪代码如下:
// T结点,L当前层,value,结点值
//返回-1:没有找到,0-n:对应层
int get_node_layer(T *node,int value ,int L)
{int i=-1;
if(node)
{
if(node->value ==value)
return L;
if(i = get_node_layer(node->left,value ,L+1)!=-1) //查左子树,如找到就返回
return i; /
if(i = get_node_layer(node->right,value ,L+1)!=-1)//查右子树,如找到就返回
return i;
}
return i;
}
3.多线程开发中我们经常用到生产者消费模式,请用伪代码写出生产者和消费者方法
3.1.生产者消费者模式
学过操作系统应该对这个概念很熟悉,简单来说就是“你生产我消费”;该模式分为三个部分:生产者,消费者和产品队列(爬虫中该产品就是URL任务队列,故以下称任务队列)。
该模式可灵活应用,生产者和消费者的比例可以是:多v多,多v一,一v多;
该模式解决多线程同步问题的思想是:对任务队列加锁,队列的出队和入队操作原子性;
该模式应用到多线程爬虫:抓取线程主动去任务队列找活干,如果没活就等待,有活了就通知那些等待的抓取线程。
3.2简例代码
一个网页抓取线程类WorkThread,一个任务队列类TaskQueue;简单示例如下,在TaskQueue类中,使用Synchronized关键字使当前线程取得对象TaskQueue的锁,并用wait和notifyAll函数进行线程间通信。
/* 任务队列类 */
public class TaskQueue
{
private Queue taskbuffer;
private int taskcount;
private int maxN;
public TaskQueue(int max)
{
maxN = max;
taskbuffer = new Queue<url>(maxN);
taskcount = 0;
}
// 生产者调用的任务入队操作
public synchronized void addTask(List<url> urlList)
{
while(maxN <= taskcount)// 如果队列够大,while语句块可以略
{
wait(); // 进入TaskQueue对象等待池,释放锁
}
while(!urlList.isEmpty())
{
taskbuffer.add(str);
taskcount++;
}
notifyAll(); // 唤醒等待池线程
}
// 消费者调动的任务出队操作
public synchronized url getTask()
{
while(taskcount <= 0)
{
wait();
}
url str = taskbuffer.pop();
taskcount--;
return str;
}
}
/* 扮演生产者和消费者的网页抓取线程 */
public class WorkThread extends Thread
{
private TaskQueue taskQueue;
private List urlList;
public WorkThread(TaskQueue tq)
{
taskQueue = tq;
urlList = new List<url>();
}
public List<url> crawl(url str)
{
/* crawl and parse the page str
* return the parse link list of page str
*/
}
public void run()
{
try {
while (true) {
Thread.sleep(1000);
url str = taskQueue.getTask(); // 扮演消费者
urlList = crawl(str); // 略去url去重,详见读写锁模式
tastQueue.addTask(urlList); // 扮演生成者
}
} catch (InterruptedException e) {
}
}
}
4.在做数据库设计时,给某个字段添加索引的依据是什么?索引有什么缺点?
数据库索引是为了增加查询速度而对表字段附加的一种标识。
缺点:
4.1数据库非常巨大,开销会很大
4.2建立太多的索引将会影响更新和插入的速度
5.请用ER图画出学生 老师 班级 课程之间的关系(略)
6.常用的网络相关命令行工具有哪些?它们的功能是什么
7.请描述TCP和UDP的优缺点及常用使用场景
Tcp的优点:
可靠,稳定
TCP的可靠性体现在传输数据之前,三次握手建立连接(四次挥手释放连接),并且在数据传递时,有确认、窗口、重传、拥塞控制机制,数据传完之后,断开连接用来节省系统资源。
TCP的缺点
慢,效率低,占用系统资源高,易被攻击
传数据之前建立连接,这样会消耗时间,而且在消息传递时,确认机制、重传机制和拥塞控制机制都会消耗大量的时间,而且要在每台设备上维护所有的传输连接。而每个连接都会占用系统的CPU、内存等硬件软件资源。并且TCP的取而机制、三次握手,这些也导致TCP容易被人利用,实现DOS,DDOS攻击。
UDP的优点
快,比TCP稍安全
UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,udp是一个无状态的传输协议,所以他在传输数据时非常快。M没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。UDP也是无法避免攻击的,比如:UDP flood攻击。。。
UDP的缺点
不可靠,不稳定
因为UDP没有TCP的那些可靠机制,在网络质量不好时很容易丢包。
在日常生活中,常见使用TCP协议的应用如下:
浏览器,用的HTTP
FlashFXP,用的FTP
Outlook,用的POP、SMTP
Putty,用的Telnet、SSH
QQ文件传输
…………
日常生活中,常见使用UDP协议的应用如下:
QQ语音
QQ视频
TFTP
8.谈谈策略模式和状态模式的区别
一个策略是一个计划或方案,通过执行这个计划或方案,我们可以在给定的输入条件下达到一个特定的目标。
而状态模式不同,对一个状态特别重要的对象,通过状态机来建模一个对象的状态;状态模式处理的核心问题是状态的迁移,因为在对象存在很多状态情况下,对各个business flow,各个状态之间跳转和迁移过程都是及其复杂的。
在状态模式中,状态的变迁是由对象的内部条件决定,外界只需关心其接口,不必关心其状态对象的创建和转化;而策略模式里,采取何种策略由外部条件(C)决定。
9.请用UML类图画出如下模型,英国人,美国人,日本人在排队,当他们出队时会用母语话说出自己的名字
10.请画出自动提款机(ATM)的用例图