iOS面试题



类别和类扩展的区别。


答案:category和extensions的不同在于 后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions可以认为是一个私有的Category。



oc中的协议和java中的接口概念有何不同?


答案:OC中的代理有2层含义,官方定义为 formal和informal protocol。前者和Java接口一样。
informal protocol中的方法属于设计模式考虑范畴,不是必须实现的,但是如果有实现,就会改变类的属性。
其实关于正式协议,类别和非正式协议我很早前学习的时候大致看过,也写在了学习教程里
“非正式协议概念其实就是类别的另一种表达方式“这里有一些你可能希望实现的方法,你可以使用他们更好的完成工作”。
这个意思是,这些是可选的。比如我门要一个更好的方法,我们就会申明一个这样的类别去实现。然后你在后期可以直接使用这些更好的方法。
这么看,总觉得类别这玩意儿有点像协议的可选协议。"
现在来看,其实protocal已经开始对两者都统一和规范起来操作,因为资料中说“非正式协议使用interface修饰“,
现在我们看到协议中两个修饰词:“必须实现(@requied)”和“可选实现(@optional)”。



什么是KVO 和 KVC?


答案:kvc:键 - 值编码是一种间接访问对象的属性使用字符串来标识属性,而不是通过调用存取方法,直接或通过实例变量访问的机制。//KVC运用了一个isa-swizzling技术。isa-swizzling就是类型混合指针机制。

KVC主要通过isa-swizzling,来实现其内部查找定位的。isa指针,就是is a kind of的意思,指向维护分发表的对象的类。该分发表实际上包含了指向实现类中的方法的指针,和其它数据。

kvo(Key-Value Observing):键值观察机制,他提供了观察某一属性变化的方法,极大的简化了代码。
用过的一个地方是对于按钮点击变化状态的的监控。
比如我自定义的一个button。   //当属性改变时KVO回提供自动的消息通知。每次属性改变了就会发送消息通知。这是因为当这个方案已经被明确定义,获得框架级支持,可以方便的采用,开法人员不需要设计自己的观察这模型,可以直接在工程里使用。KOV的架构可以支持多个观察者观察同一个属性,以及相关值。



[self addObserver:self forKeyPath:@"highlighted" options:0 context:nil]; 



 
#pragma mark KVO


 
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context


{ 
    if ([keyPath isEqualToString:@"highlighted"] )

{ 


[self setNeedsDisplay]; 


} 


} 


对于系统是根据keypath去取的到相应的值发生改变,理论上来说是和kvc机制的道理是一样的。
对于kvc机制如何通过key寻找到value:
“当通过KVC调用对象时,比如:[self valueForKey:@”someKey”]时,程序会自动试图通过几种不同的方式解析这个调用。首先查找对象是否带有 someKey 这个方法,如果没找到,会继续查找对象是否带有someKey这个实例变量(iVar),如果还没有找到,程序会继续试图调用 -(id) valueForUndefinedKey:这个方法。如果这个方法还是没有被实现的话,程序会抛出一个NSUndefinedKeyException 异常错误。
 
(cocoachina.com注:Key-Value Coding查找方法的时候,不仅仅会查找someKey这个方法,还会查找getsomeKey这个方法,前面加一个get,或者_someKey以及 _getsomeKey这几种形式。同时,查找实例变量的时候也会不仅仅查找someKey这个变量,也会查找_someKey这个变量是否存在。)
 
设计valueForUndefinedKey:方法的主要目的是当你使用-(id)valueForKey方法从对象中请求值时,对象能够在错误发生前,有最后的机会响应这个请求。这样做有很多好处,下面的两个例子说明了这样做的好处。“
来至cocoa,这个说法应该挺有道理。
因为我们知道button却是存在一个highlighted实例变量.因此为何上面我们只是add一个相关的keypath就行了,
可以按照kvc查找的逻辑理解,就说的过去了。


代理的作用?


答案:代理的目的是改变或传递控制链。允许一个类在某些特定时刻通知到其他类,而不需要获取到那些类的指针。可以减少框架复杂度。

oc中可修改和不可以修改类型。


答案:就是可动态添加修改和不可动态添加修改一样。
比如NSArray和NSMutableArray。前者在初始化后的内存控件就是固定不可变的,后者可以添加等,可以动态申请新的内存空间。


我们说的oc是动态运行时语言是什么意思?


答案:多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
这个问题其实浅涉及到两个概念,运行时和多态。
运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。
多态:不同对象以自己的方式响应相同的消息的能力叫做多态。
//都用有一个相同的方法,不同的对象以自己的方式响应了相同的消息.
因此也可以说,运行时机制是多态的基础


通知和协议的不同之处?


答案:协议有控制链(has-a)的关系,通知没有。//通知:它可以一对多,一条消息可以发送给多个消息接受者,但是不会处理消息
控制链:单一拥有和可控制的对应关系。



关于多态性


答案:多态,子类指针可以赋值给父类。
对象不仅仅可以已本身的类型存在,也可以作为其父类类型存在。

 多态性是允许将父对象设置成为和一个或多个它的子对象相等的技术, 多态性使得能够利用同一类(基类)

类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作.


说说响应链


答案: 事件响应链。包括点击事件,画面刷新事件等。在视图栈内从上至下,或者从下之上传播。


frame和bounds有什么不同?


答案:frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)//frame:框架、结构


bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)//bounds:界限


 一个tableView是否可以关联两个不同的数据源?你会怎么处理?


答案:首先从代码来看,数据源如何关联上的,其实是在数据源关联的代理方法里实现的。
 



-(UITableViewCell*)cellForRowAtIndexPath:(NSIndexPath*)indexPath


{


if(indexPath.section == 0)


{


}


if(indexPath.section == 1)


{


}


}



什么是id类型


答案:id类型的变量可以存放任何数据类型的对象。在内部处理上,这种类型被定义为指向对象的指针,实际上

是一个指向这种对象的实例变量的指针。
例如:id number
将number声明为id类型的变量。可声明的方法使其

具有id类型的返回值,如下:


-(id)newObject;(int)type;
这个程序声明了一个名为newObject的实例方法,它具有名为type的单个整型参

数并有id类型的返回值。应该注意的是,对返回值和参数类型声明来说,id是默认的类型。
id类型是objetive-c中

非常中药店额数据类型,它是多态和动态绑定的基础。


写一个NSString类的实现 


+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;

+ (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding

{


  NSString *obj;

 
 obj = [self allocWithZone:NSDefaultMallocZone()];


   obj = [obj initWIthCString:nullTerminatedCString encoding: 
encoding];


   return AUTORELEASE(obj);


}


写一个委托的interface


答: 

 
@protocol MyDelegate; 


@interface MyClass: NSObject 


{

 
 id <MyDelegate> delegate; 


} 


// 委托方法 


@protocol MyDelegate 


- (void)didJobs:(NSArray *)args; 


@end












你可能感兴趣的:(iOS面试题)