zoukankan      html  css  js  c++  java
  • iOS 面试题 2

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

    2.为什么很多内置类如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,产生循环了。

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

    4、         写一个便利构造器。

    +(id)leftModelWith{

    leftModel * model = [self alloc]init];

    return model;

    }

    5、         UIImage初始化一张图片有几种方法?简述各自的优缺点。
    3种,

    imageNamed:系统会先检查系统缓存中是否有该名字的image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回.

    initWithContentsOfFile:系统不会检查缓存,而直接从文件系统中记载并返回.

    imageWithCGImage:scale:orientation 当scale= 1的时候图像为原始大小,orientation指定绘制图像的方向.

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

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

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

    self.person = per;

    1或者2.看person是什么类型修饰的.

    alloc+1,assign+0,retain+1.

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

    @implementation Person

    - (void)setAge:(int)newAge {

    self.age = newAge;

    }

    @end
    死循环

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

    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);

    }

    }

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

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

      1.  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];

                }

            }

        }

     ||

    2.

    NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];

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

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

        if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {

        [ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];

        }

      }

    }

    NSLog(@"%@", ary);

    11、         简述你对UIView、UIWindow和CALayer的理解

    UIWindow是应用的窗口,继承于UIResponder.一个程序只有一个主window,可以有多个window.

    UIView继承于UIResponder, UIResponder继承于NSObject,是创建窗口中的一个视图,可以响应交互事件.

    CALayer继承于NSObject,所以CALayer不能响应事件,CALayer是用来绘制内容的,对内容进行动画处理依赖于UIView来进行显示,一个view可有多个图层

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

    代理:遵守协议的对象.

    @class MyView;

    第一步:指定协议:(协议名:类名+Delegate)

    @protocol MyViewDelegate <NSObject>

    @required

    -(void)changeViewBackgroudColor:(MyView *)view;

    @optional

    -(void)test;

    @end

    @interface MyView : UIView

    第二步:指定代理

    @property (nonatomic,assign)id<MyView> delegate;

    @end

    第三步:代理遵循协议.

    第四步:代理实现协议里面的必须实现的方法和其他可选方法.

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

    13、         分析json、xml的区别?json、xml解析方式的底层是如何处理的?

    Json:键值对.数据小,不复杂.便于解析,有框架支持,适合轻量级传输.作为数据包个数传输的时候效率更高.

    xml:标签套内容.xml数据量较大,比较复杂.适合大数据量的传输.解析方式有两种,DOM和SAX,DOM需要读入整个XML文档(文档驱动),SAX是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。

    14、         ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?

    1.当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向所有ViewController发送内存警告.

    2.打开系统相机.

    3.加载高清图片.

    默认操作:把里面没有用的对象进行释放.

    15、         面向对象的三大特征,并作简单的介绍

    封装、继承、多态。

    封装:代码模块化,方便以后调用.

    继承:子类继承父类的所有方法和属性.

    多态:父类指针指向子类对象.

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

    属性的三大特性:语义特性,原子特性,读写特性.

    同时重写setter和getter方法,@synchronized name = _name,关联属性和实例变量.

    - (void)setName:(NSString *)name{

    if(_name != name){

    [_name retain];

    [_name release];

    _name = name;

    }

    }

    - (NSString *)name{

    return [[_name retain]autorelease];

    }

    17、         简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?

    NotificationCenter:消息中心.消息通知.

    KVC:利用键-值间接访问类中的某个属性.而不是通过调用getter和setter方法访问。

    [self setValue:@"123" forKeyPath:@"name"];

    NSLog(@"%@",[self valueForKeyPath:@"name"]);

    KVO:利用键-路径间接访问类中的某个属性,也就是观察者模式(KVO+通知中心).观测指定对象的属性,当指定对象的属性更改之后会通知相应的观察者。

    Delegate:用于多个类之间的传值.delegate遵循某个协议并实现协议声明的方法。

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

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

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

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

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

    23、         谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?

    MVC是Model-VIew-Controller,就是模型-视图-控制器, MVC把软件系统分为三个部分:Model,View,Controller。
    高类聚,低耦合,提高代码的复用性.
    在cocoa中,你的程序中的每一个object(对象)都将明显地仅属于这三部分中的一个,而完全不属于另外两个。。
    单例模式,delegate设计模式,target-action设计模式

    24、         如监测系统键盘的弹出

    通知.

    [[NSNotificationCenter defaultCenter]addObserver:self   selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];

    25、         举出5个以上你所熟悉的ios  sdk库有哪些和第三方库有哪些?

    系统库:UIKit框架:负责应用程序的图形及事件驱动的关键基础,如:用户界面管理,图形和窗口支持.

    Mapkit框架:地图.

    Message UI框架:电子邮件

    AV Foundation框架:可用于音频播放.

    OpenAL框架:用于播放,可播放高质,高性能的网络音频

    Core Data框架:将数据存储在SQLite数据库.

    Core Media框架:播放视频.

    第三方:SDWebImage :简化图片处理

    ShareSDK    分享

    SVProgressHUD   轻量级菊花

    AFNetworkin  方便网络开发

    FreeStreamer  播放音频

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

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

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

    29、         单例目的是什么,并写出一个?
    当一个类只能有一个实例的时候需要使用单例。

    static SortDetailsModelDown * single = nil;

    +(SortDetailsModelDown *)shareSortDetailsModelDown{

    @synchronized(self){

    if (!single) {

    single = [[SortDetailsModelDown alloc]init];

    }

    }

    return single;

    }

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

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

  • 相关阅读:
    sql server 分析
    3月5日总结
    sql server sql语句
    sql server数据类型char和nchar,varchar和nvarchar,text和ntext
    GIT 查看/修改用户名和邮箱地址
    Ubuntu安装LAMP环境(PHP5.6) 以及下载安装phpmyadmin
    Windows 10和Ubuntu 16.04双系统时间错误的调整
    php定界符<<<EOF讲解(转)
    matlab示例程序--Motion-Based Multiple Object Tracking--卡尔曼多目标跟踪程序--解读
    sa分析
  • 原文地址:https://www.cnblogs.com/Bo-tree/p/5371482.html
Copyright © 2011-2022 走看看