iOS面试题 集锦(1)

这是我从许多iOS面试题中筛选和提炼出来的,在这里留下来备用

1 static关键字的作用 (表示看到这题,顿时蒙圈,static是啥啊)
(1) 函数体内static变量的作用范围为该函数体,不同与auto变量,该变量的内存只被分配一次,因此其值在下次调用的时候任然维持上次的值的 (靠,说白了 就是不变的啦。。)
(2) 在模块内的static全局变量可以被模块内的函数访问,但不能被模块外的其他函数访问。(私有的!)
(3) 在模块内的static函数只可被这一模块内的其他函数调用,这个函数的使用范围被限制在声明它的模块内。
(4)在类中的static成员变量属于整个类所拥有的,对类的所有对象只有一份拷贝(表示不懂。。)

2 线程与进程的区别和联系(这个题目,好多面试题上都有,说明十分重要,make)
进程和线程的主要区别在于他们是不同操作系统资源管理的方式。进程有独立的地址控件,一个进程崩溃后,在保护模式(什么是保护模式?)下不会对其他进程产生影响,而线程只是一个进程中不同的执行路径。
线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但进程切换的时候耗费资源较大,效率要差一点

3 堆和栈的区别(同样是基础题)
管理方式:对于栈来讲,是由编译器自动管理的,无需我们手动控制;对于堆来说,需要程序员自己管理控制,容易内存泄露
申请大小:栈是一块连续的内存控件,可获得的控件较小;堆是不连续的内存区域,可获得控件灵活,也比较大。

4 什么是键-值,键路径又是什么(就是KVC 和KVO。。)
键-值模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值—它是一种间接访问对象的属性的机制(KVC中间的赋值。。。)
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列,也就是观察者模式,基于KVC和通知中心,观察的是实例变量。能实时监听变化(就是KVO观察者模式)

5 目标-动作机制(target-action 设计模式)
目标是动作消息的接收者。一个控件,或者一个常见的单元,以插座变量的形式保有其动作的消息目标
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法
程序需要某些机制来进行事件和指令的翻译,这个机制就是目标-动作机制

6 分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
Categories 是对于现有的一个类的扩展,Extensions是定义私有的变量。
Extensions是子类对于父类已经拥有的成员变量的继承,创建了新的类。
Catigories还是原有的类,只是对于原有的类进行了一定功能的扩充,但是不能添加属性和实例变量
Catigories不能添加实例变量的原因是,类的方法中使用的都是静态变量,不能使用实例变量

7 类工厂方法是什么(原谅我再次没听说过。。。。)
类工厂方法的实现是为了向客户提供方便,它们将分配和初始化和在一个步骤中,返回被创建的对象,并且进行自动释放处理。
这些方法的形式是+(type)className… (其中className不包含任何前缀)。
类工厂方法可能不仅仅为了方便使,它们不但可以将分配和初始化合在一起,还可以为初始化提供对象的分配信息。
类工厂方法可以避免为可能没有用的对象盲目分配内存

8 单例的实现(伪单例)

// 普通单例实现
+ (UserInfo *)shareInstance
{
    @synchronized(self){
        if (user == nil) {
            user = [[UserInfo alloc] init];
        }
        return user;
    }
}
// GCD方式实现
+ (UserInfo *)shareInstance
{
    static dispatch_once_t onceToken
    dispatch_onec(&onceToken, ^{
        if(user == nil)
        {
            user = [[UserInfo alloc] init];
        }
    });

}

9 iOS动态识别、动态类型和动态绑定
动态识别:来自不同类可以定义共享相同名称的方法。
动态类型:能使程序直到执行时才确定对象所属类型。
动态绑定:能使程序直到执行时才确定要对对象调用的实际方法。

10 Objective - C 的优缺点
优点:
(1)Cateogries(类别)
(2)Posing
(3)动态识别
(4)指标计算
(5)弹性通讯传递
(6)可与C++混编
缺点:
(1)不支持援命名空间
(2)不支持运算符重载
(3)不支持多继承
(4)使用动态运行时类型时,所有的方法都是函数调用,所以很多编译时优化方法都用不到(如内联函数)

11 面向对象的三大特征,并作简单的介绍
封装:代码模块化,方便以后使用
继承:子类继承父类的所有方法和属性
多态:父类指针指向子类对象

12 ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
当应用的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时系统会调用这个方法向所有的ViewController发送内存警告。调用了这个方法之后,对view进行释放并且调用viewDidUnload方法
默认操作:把里面没有用的对象进行释放

13 分析json、xml的区别?json、xml解析方式的底层是如何处理的?
Json:键值对,数据小,不复杂,便与解析,有框架支持,适合轻量级传输。
XML:分为DOM解析和SAX解析。DOM解析的原理是:遇到开标签入栈,关标签出栈。SAX解析是逐行解析,没办法获取文件的层级关系

14 简述你对UIView、UIWindow和CALayer的理解
UIWindow是应用的窗口,继承与UIResponder
UIView继承与UIView,是创建窗口中的一个视图,可以响应交互事件,一个程序只有一个主Window,可以有多个View。
CALayer是一个图层,一个View可以有多个图层,不可以响应交互事件

15 写一个完整的代理,包括声明,实现
第一步:在需要协议的类里面制定协议

// TouchView.h
@class TouchView; // 声明本类

@protocol TouchViewDelegate <NSObject>
@optional //可选方法
// 开始被点击
- (void)touchViewBeginTouched:(TouchView *)touchView;
// 结束被点击
- (void)touchViewEndTouched:(TouchView *)touchView;

@end

第二步:给外界提供设置Delegate属性的接口

// TouchView.h
// 在定义Delegate属性的时候 需要使用assign关键字 防止产生循环引用
@property(nonatomic,assign)id<TouchViewDelegate>delegate;

第三步:指定代理

//RootVC.m
TouchView *touchview = [[TouchView alloc]initWithFrame:CGRectMake(100, 100, 100, 100)];
    touchview.backgroundColor = [UIColor greenColor];
    touchview.delegate = self;//代理为RootVC
    [self.view addSubview:touchview];
    [touchview release];

第四步:代理遵守协议

//RootVC.m
 #import "TouchView.h"// 引入头文件
 @interface RootViewController ()<TouchViewDelegate>// 延展上接收协议
   @end

第五步:代理实现协议里面需要实现的方法

//RootVC.m
- (void)touchViewBeginTouched:(TouchView *)touchView
{
    self.view.backgroundColor = [UIColor redColor];
}
- (void)touchViewEndTouched:(TouchView *)touchView
{
    touchView.backgroundColor = [UIColor blackColor];
}

第六步:委托方通知代理开始执行方法

// TouchView.m
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    // 如果代理存在或者代理能够响应代理的方法
    if (_delegate && [_delegate respondsToSelector:@selector(touchViewBeginTouched:)])
    {
        [_delegate touchViewBeginTouched:self];
    }
}
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (_delegate && [_delegate respondsToSelector:@selector(touchViewEndTouched:)])
    {
        [_delegate touchViewEndTouched:self];
    }
}

16 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?

retain配对使用的方法是release;alloc对应的才是dealloc,内存的释放用release,而dealloc是用来销毁内存的。

17 变量的@protected ,@private,@public,@package,声明各有什么含义?
@protected : (受保护的)该类和所有子类中的方法可以直接访问这样的变量
@private :(私有的) 该类中的方法可以访问,子类不可以访问
@public : (公共的)可以被所有类访问
@package : 本包内使用,夸包不可以使用

18 谈谈你对多线程开发的理解?ios中有几种实现多线程的方法?
(1) 多线程可以解决负载不均衡的问题,充分利用cpu资源
(2) 大多数情况下 要用到多线程的主要是需要处理大量的IO操作时或者处理的情况需要花大量的时间等等
(3) iOS中有三种主要方法实现多线程 1,NSThread 2,NSOperation 3,GCD

19 iOS类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
不能多继承,用category 和 extension 可以实现
category 是可以为已有的类添加函数,但是不允许为已有的类添加新属性或者成员变量

20 iOS本地数据存储都有哪几种方式?
(1)plist文件
(2)NSUserDefaults
(3)SQLite3
(4)NSKeyedArchiver(加密形式)
(5)Core Data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值