iOS中经常会问到的面试题

本文深入讲解iOS开发基础知识,包括启动顺序、UITableView使用方法、代理模式、MVC架构及常用设计模式等内容,帮助初学者快速掌握iOS开发核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.          描述应用程序的启动顺序

1.程序入口main函数创建UIApplication实例和UIApplication代理实例

2.在UIApplication代理实例中重写启动方法,设置跟视图控制器

3.在跟视图控制器中添加控件,实现对应的程序界面

 

2.为什么很多内置类如UITableViewControldelegate属性都是assign而不是retain?请举例说明

                     主要是为了避免循环引用

Student* str=[];

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

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

teacher.delegate=student;

student.delegate=teacher;

在teacher中dealloc的方法中会对其代理student进行释放,就会触发student对象release,这样也会导致student调用其dealloc方法,同理,其代理teacher也会被release掉,那么他们互相持有,就产生循环了,始终释放不掉

3.使用UITableView时候必须要实现的几种方法?

两个

numberOfRowsInSection

cellForRowAtIndexPath

4.写一个便利构造器。(类名打头, 类方法)

+(id)studentWithName:(NSString *)name andAge:(NSInter)age

{

           UIView* view = [[UIView alloc] initWithName:name andAge:age];

           Return  view;

}

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

1.imageNamed: 这样会造成内存泄露(因为系统默认经常访问的会放在内存),系统会先检查缓存中是否有改名字的Image,如果有的话,则直接返回,如果没有,则会先加载图像到缓存,然后再返回使用(这样会造成内存问题)

2.initWithContentsOfFile: 系统不会检查系统缓存,而是直接从文件系统中加载并返回,并不占用系统缓存

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

@implementation Person

- (void)setAge:(int)newAge {

self.age = newAge; 

if()

}

@end

 

会产生死循环,因为使用self. 就会调用setter方法,相当于自己一直调用自己

 

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

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

NSString *string = @Abc;

string = [string lowercaseString];  //便利构造器, 自动释放的变量

string = [stringstringByAppendingString:@"xyz"];

NSLog(@%@, string);

}

 

会出现内存泄露

修改之后:

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

NSAutoreleasePool * pool1 = [[NSAutoreleasePool alloc] init];

NSString *string = @"Abc";

string = [stringlowercaseString];

string = [stringstringByAppendingString:@"xyz"]; NSLog(@"%@",string);

//释放池

[          pool1 drain];

 }

如果数字很大的话会照成内存一直增加(有可能瞬间就将内存使用完毕),直到循环结束才减少

8.截取字符串20 | http://www.baidu.com中,|字符前面和后面的数据,分别输出它们。

NSString * str = @"20 | http://ww.baidu.com";

    NSArray * array = [str componentsSeparatedByString:@"|"];

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

        NSLog(@"%d=%@",i,[array objectAtIndex:i]);

}

 

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

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

    NSString * temp;

    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]) {

               temp = [array objectAtIndex:j];

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

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

            }

        }

    }

    NSLog(@"arr = %@", array);

 

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

UIWindow 是整个程序的主窗口

UIView负责展示的 ,侧重于对内容的管理,继承自UIResponder因此可以响应用户事件

CALayer用于对视图的绘制,比如设置圆角之类的,它继承与NSObject,因此不能响应事件

 

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

包含代理的声明,协议的定义,以及遵从协议

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

解析用的类不同,解析方式不同,格式不同

json底层原理遍历字符串中的字符,最终根据各市规定的特助字符,比如{},[],:号等进行区分,{}是字典,[]表示的时数组,:号是字典的键和值的分水岭,最终是将json数据转化为字典。Xml两种解析方式,开标签, 闭标签,DOM和SAX,DOM需要读入整个XML文档再解析(文档驱动),SAX(逐行解析)是事件驱动的,并不需要读入整个文档,文档的读入过程也就是SAX的解析过程。  XML 解析的时候,需要在header search path引入 /user/include/libxml

 

Jsonkit  SBJson 均不支持ARC,要想支持arc需要(-fobjc-arc,兼容非arc需要  -fno-objc-arc), 有时候系统解析不出来某些json, ASIRequest (不支持ARC, 支持断点续传)AFNetworking (支持ARC,不支持断点续传) 解析出

下边是兼容arc和非arc,其实我们只需要在XCode中设置源代码的CompilerFlags就能让ARCnon-ARC文件共存。点击Project->Targets->Build Phasesfeɪz阶段)标签->展开Compilekəm'paɪl  vt. 编译;编制;编辑;[图情] 汇编Sources,双击某个.m文件的文件名,然后加上“-fno-objc-arc”这个标记,就可以指定此.m文件按照non-ARC方式编译。对应的如果加上“-fobjc-arc”标记,就可以指定.m文件按照ARC方式编译
13. ViewController 的 didReceiveMemoryWarning 是在什么时候被调用的?默认的操作是什么?

内存警告一般2级, 到第三次就会闪退

didReceiveMemoryWarning在出现内存警告的时候执行该方法,在该方法里面释放掉暂时没使用的可重用(可重构)的对象。移除掉某些不需要的视图

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

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

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

注意内存的优化
16.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?

 

1.通知中心: 观察者模式,是一对多的。。

其他类注册这个notification就可以收到通知,这些类可以在收到通知时做自己的操作(多观察者默认随机顺序发通知给观察者们,而且每个观察者都要等当前的某个观察者的操作做完才能轮到他来操作,可以用NotificationQueue的方式安排观察者的反应顺序,也可以在添加观察者中设定反映时间,取消观察需要在dealloc和didReceiveMemoryWarning中都要注销

2.KVC键值编码,可以直接通过字符串的名字(key)来间接访问属性的机制,而不是通过调用getter和setter方法访问。

先查_打头的变量, myId = _id

setValue forDictionary

person setValueforDictionary

3. KVO:观测指定对象的属性,当指定对象的属性更改之后会通知相应的观察者。要记得移除观察者
delegate:一对一,delegate遵循某个协议并实现协议声明的方法。

 

17、What is lazyloading?

在使用的时候才去初始化,比如UITableViewCell的imageView和textLabel属性,懒加载对象的创建是在setter方法(点方法)里面进行创建的。

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

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

注意:如果方法多的话,在 延展中一般先把方法列出来,类似声明,方便以后查看

  最后一问:没有为什么

 

20.Objective-C有私有方法么?私有变量呢?如果没有的话,有没有什么代替的方法?、

objective-c类里面的方法只有两种, 静态方法和实例方法.但是可以通过把方法的声明和定义都放在.m文件中来实现一个表面上的私有方法。有私有变量,可以通过@private来修饰,或者把声明放到.m文件中。在ObjectiveC,所有实例变量默认都是私有的,所有实例方法默认都是公有的,,,延展定义的变量和方法都是私有的

21. #import、#include和@class有什么区别


#includec语言中引入一个头文件,但是可能出现交叉编译
#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设计模式, 观察者,, 工厂模式, 自定义cell

23.如监测系统键盘的弹出
[[NSNotificationCenterdefaultCenter] addObserver:self selector:@selector( ) name:UIKeyboardWillShowNotification object:nil];
24.
举出5个以上你所熟悉的ios  sdk(软件开发工具包)库有哪些和第三方库有哪些?

Foundation提供了一系列处理字串,排列,组合,日历,时间等等的基本功能

QuartzCore.framework核心框架

核心图像框架CoreGraphics.framework

UIKit提供实现图形,事件驱动的iPhone应用的关键架构

Security是用来处理认证,密码管理,按安全性管理的

核心位置框架(CoreLocation.framework)

访问数据库SQLite的头文件位于/usr/include/sqlite3.h,其中是SDK安装的目标路径

libXML2库提供操作XML内容的功能,

CoreAudio.framework定义核心音频的音频数据类型

电话本UI框架(AddressBookUI.framework)

 

Foundation,CoreGraphics,UIKit,MapKit,CoreLocation,CFNetWork,MessageUI,ImageIO(),CoreData,AFNetWorking,MKNetWorkKit,ASIHttpRequest,FMDB,ZXing,ZBar,SDWebImage

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

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

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

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

29.说说响应链  uiview   UIImageview UIResponser UIViewController
视图 -> 父视图 (…父视图直到根视图)->根视图 -> 根视图控制器 -> window -> UIApplication --> App Delegate ->遗弃此事件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值