码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 面试题 2

时间:2016-04-09 15:11:10      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:

1、         描述应用程序的启动顺序。
1、程序入口main函数创建UIApplication实例和UIApplication代理实例
2、在UIApplication代理实例中重写启动方法,设置第一ViewController
3、在第一ViewController中添加控件,实现对应的程序界面。

为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
防止循环引用,
Student * str=[];

Teacher *teacher=[[Teacher alloc] init];

Student * student=[[Student alloc] init];

teacher.delegate=student;

student.delegate= teacher;

在teacher中dealloc会release当前的Delegate,就会触发student对象release,继而也会导致student执行dealloc,在student中也会release自己的delegate,产生循环了。

2、         使用UITableView时候必须要实现的几种方法?
2个。
-(NSInteger)tableView:(UITableView*)tableViewnumberOfRowsInSection:(NSInteger)section;这个方法返回每个分区的行数
-(UITableViewCell*)tableView:(UITableView*)tableViewcellForRowAtIndexPath:(NSIndexPath)indexPath;这个方法返回我们调用的每一个单元格

3、         写一个便利构造器。
+ (id)studentWithName:(NSString *)newName andAge:(int)newAge
{
         Student *stu = [[Student alloc] initWithName:newName andAge:newAge];
         return [stu autorelease];
}

4、         UIImage初始化一张图片有几种方法?简述各自的优缺点。
1、从资源读取
UIImage *image = [UIImage imageNamed:@”1.png”];
2、从网络读取
NSURL*url=[NSURL URLWithString:@"http://www.sinaimg.cn/qc/photo_auto/chezhan/2012/50/00/15/80046_950.jpg"];
3.从手机本地读取
//读取本地图片非resource
NSString *aPath3=[NSString stringWithFormat:@"%@/Documents/%@.jpg",NSHomeDirectory(),@"test"];
UIImage *imgFromUrl3=[[UIImage alloc]initWithContentsOfFile:aPath3]; 4.从现有的context中获得图像

//add ImageIO.framework and #import <ImageIO/ImageIO.h> 

CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);

CGContextRef ctx=UIGraphicsGetCurrentContext();

CGContextSaveGState(ctx);

//transformCTM的2种方式

//CGContextConcatCTM(ctx, CGAffineTransformMakeScale(.2, -0.2));

//CGContextScaleCTM(ctx,1,-1);

//注意坐标要反下,用ctx来作为图片源

CGImageRef capture=CGBitmapContextCreateImage(ctx);

CGContextDrawImage(ctx, CGRectMake(160, 0, 160, 230), [image CGImage]);

CGContextDrawImage(ctx, CGRectMake(160, 230, 160, 230), img);

CGImageRef capture2=CGBitmapContextCreateImage(ctx);

5、用Quartz的CGImageSourceRef来读取图片

CGImageSourceRef source = CGImageSourceCreateWithURL((CFURLRef)url, NULL);

CGImageRef img= CGImageSourceCreateImageAtIndex(source,0,NULL);

参考(http://blog.csdn.net/jerryvon/article/details/7526147#)

5、         回答person的retainCount值,并解释为什么

Person * per = [[Person alloc] init];

self.person = per;
person属性如果为assign的话retainCount为1,如果为retain的话retainCount为2

6、         这段代码有什么问题吗:

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge;

}

@end
死循环

7、         这段代码有什么问题,如何修改

for (int i = 0; i < someLargeNumber; i++) {

NSString *string = @”Abc”;

string = [string lowercaseString];

string = [string stringByAppendingString:@"xyz"];

NSLog(@“%@”, string);

}

如果数字很大的话会造成内存一直增加(因为一直通过便利构造器方法创建autorelease对象),直到循环结束才减少,在循环内加一个自动释放池,更改后代码如下:

for (int i = 0; i < someLargeNumber; i++) {

NSString *string = @”Abc”;
@autoreleasepool {

      string = [string lowercaseString];

      string = [string stringByAppendingString:@"xyz"];

      NSLog(@“%@”, string);

 

}

}

 

8、         截取字符串”20 | http://www.baidu.com”中,”|”字符前面和后面的数据,分别输出它们。
NSString *string = @” 20 | http://www.baidu.com”;
[string componentsSeparatedByString:@”|”];

9、         用obj-c写一个冒泡排序

                     NSMutableArray *array = [NSMutableArray arrayWithArray:@[@"3",@"1",@"10",@"5",@"2",@"7",@"12",@"4",@"8"]];

    NSString  *tmp;

    for (int i = 0; i < array.count; i ++) {

        for (int j = 0; j < array.count  - 1 - i; j++) {

            if ([[array objectAtIndex:j] integerValue] > [[array objectAtIndex:j + 1] integerValue]) {

                tmp = [array objectAtIndex:j];

                [array replaceObjectAtIndex:j withObject:[array objectAtIndex:j + 1]];

                [array replaceObjectAtIndex:j + 1 withObject:tmp];

            }

        }

    }

 

 

10、         简述你对UIView、UIWindow和CALayer的理解
UIView继承于UIResponder, UIResponder继承于NSObject,UIView可以响应用户事件。CALayer继承于NSObject,所以CALayer不能响应事件。
UIView构建界面,UIView侧重于对内容的管理,CALayer侧重于对内容的绘制。
UIView是用来显示内容的,可以处理用户事件;CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。

11、         写一个完整的代理,包括声明,实现

12、         分析json、xml的区别?json、xml解析方式的底层是如何处理的?
json底层原理便利字符串中的字符,最终根据各市规定的特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的时数组,:号是字典的键和值的分水岭,最总是将json数据转化为字典。Xml两种解析方式,DOM和SAX,DOM需要读入整个XML文档(文档驱动),SAX是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。

13、         ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?
didReceiveMemoryWarning在出现内存警告的时候执行该方法,在该方法里面释放掉暂时没使用的可重用的对象。

14、         面向对象的三大特征,并作简单的介绍
封装、继承、多态。封装:是把客观事物封装成抽象的类,隐藏内部的实现,对外部提供接口。继承:可以使用现有类的所有功能,并且在无需重新编写原来的类的情况下对这些功能进行扩展。多态:不同的对象以自己的方式响应相同的的消息的能力叫做多态,或者说父类指针指向子类对象<如UITableView的,cellForRow方法,返回值类型是UITbaleViewCell,但是你返回的cell可以是你自定义的cell,在比如多个类里面都有同一个方法>

15、         重写一个NSStrng类型的,retain方式声明name属性的setter和getter方法

16、         简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?
Notification:观察者模式,controller向defaultNotificationCenter添加自己的 notification,其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给 观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也 可以在添加观察者中设定反映时间,取消观察需要在viewDidUnload 跟dealloc中都要注销)。

KVC键值编码,可以直接通过字符串的名字(key)来间接访问属性的机制,而不是通过调用getter和setter方法访问。
KVO:观测指定对象的属性,当指定对象的属性更改之后会通知相应的观察者。
delegate:一对一,delegate遵循某个协议并实现协议声明的方法。

17、         What is lazy loading?
在使用的时候才去初始化,比如UITableViewCell的imageView属性,懒加载对象的创建是在setter方法里面进行创建的。

18、         什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?
协议提供了一组方法,但是并不负责实现,如果一个类遵循了某个协议,并且实现了协议里面的方法,那么我们称这个类就是遵循了某个协议的代理。属性的声明使用assign,防止出现循环引用的问题。

19、     分别描述类别(categories)和延展(extensions)是什么?以及两者的区别?继承和类别在实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?
category类目:在不知道源码的情况下为一个类扩展方法,extension:为一个类声明私有方法和变量。
继承是创建了一个新的类,而类别只是对类的一个扩展,还是之前的类。
类目的作用就是为已知的类添加方法。

20、         Objective-C有私有方法么?私有变量呢?如多没有的话,有没有什么代替的方法?
objective-c – 类里面的方法只有两种, 静态方法和实例方法. 
@private来修饰私有变量
OC中所有的实例变量默认都是私有的,所有的实例方法默认都是公有的。

21、         #import、#include和@class有什么区别
#include c语言中引入一个头文件,但是可能出现交叉编译
#import在OC中引入自己创建的头文件#import””或者系统框架#import<>。#import不会出现交叉编译
@class对一个类进行声明,告诉编译器有这个类,但是类的定义什么的都不知道

22、         谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?
MVC是Model-VIew-Controller,就是模型-视图-控制器, MVC把软件系统分为三个部分:Model,View,Controller。在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。MVC可以帮助确保帮助实现程序最大程度的可重用性。各MVC元素彼此独立运作,通过分开这些元素,可以构建可维护,可独立更新的程序组建。
单例模式,delegate设计模式,target-action设计模式

23、         如监测系统键盘的弹出
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];

24、         举出5个以上你所熟悉的ios  sdk库有哪些和第三方库有哪些?
Foundation,CoreFraphics,UIKit,MapKit,CoreLocation,CFNetWork,MessageUI,ImageIO,CoreData,AFNetWorking,MKNetWorkKit,ASIHttpRequest,FMDB,ZXing,ZBar,SDWebImage

25、         如何将产品进行多语言发布?
程序的国际化

26、         如何将敏感字变成**
字符串替换stringByReplacingOccurrencesOfString:  withString:

27、         objc中的减号与加号代表什么?
+静态方法,也叫类方法,-实例方法

28、         单例目的是什么,并写出一个?
当一个类只能有一个实例的时候需要使用单例。创建参照第2个文件

29、     说说响应链
当事件发生的时候,响应链首先被发送给第一个响应者(往往是事件发生的视图,也就是用户触摸屏幕的地方)。事件将沿着响应者链一直向下传递,知道被接受并作出处理。一般来说,第一响应这是个视图对象或者其子类,当其被触摸后事件就交由它处理,如果他不处理,时间就会被传递给视图控制器对象UIViewController(如果存在),然后是它的俯视图对象(superview),以此类推知道顶层视图。接下来会沿着顶层视图(top view)到窗口(UIwindow 对象) 再到程序的(UIApplication对象),如果整个过程都没有响应这个事件,则该事件被丢弃,一般情况下,在响应链中只要有对象处理事件,事件就会被传递

         典型的响应路线图如:
      First  Responser --> The Window -->The Applicationn --> App Delegate

 

iOS 面试题 2

标签:

原文地址:http://www.cnblogs.com/Bo-tree/p/5371482.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!