iOS面试总结(一)

主要题型:
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混合编译

    添加标签的方法:

  1. 打开:你的target -> Build Phases -> Compile Sources.
  2. 双击对应的 *.m 文件
  3. 在弹出窗口中输入上面提到的标签 -fobjc-arc / -fno-objc-arc
  4. 点击 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]



  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值