版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
iOS程序员面试分类模拟27简答题1.
UIKit类要在哪一个应用线程上使用?正确答案:UIKit的界面类只能在主线程上使用,对界面进行更新,多线程环境中要对界面进行更新必须要切换到主线程上。
(江南博哥)
例如下面的问题代码:
@interfaceTTWaitController:UIViewController
@property(strong,nonatomic)UILabel*alert;
@end
@implementationTTWaitController
-(void)TiewDidLoad
{
CGRectframe=CGRectMake(20,200,200,20);
self.alert=[[UILabelalloc]initWithFrame:frame];
self.alert.text=@"Pleasewait10seconds...";
self.alert.textColor=[UIColorwhiteColor];
[self.viewaddSubview:self.aleft];
NSOperationQueue*waitQueue=[[NSOperationQueuealloc]init];
[waitQueueaddOperationWithBlock:^{
[NSThreadsleepUntilDate:[NSDatedateWithTimeIntervalSinceNow:10]];
self.alert.text=@"Thanks!";
}];
}
@end
@implementationTTAppDelegate
-(BOOL)application:(UIApplication*)application
didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
self.window=[[UIWindowalloc]initWithFrame:[[UIScreenmainScreen]bounds]];
self.window.rootViewController=[[TTWaitControlleralloc]init];
[self.windowmakeKeyAndVisible];
returnYES;
}
这段代码是想提醒用户等待10s,10s后在标签上显示“Thanks”,但多线程代码部分NSOperationQueue的addOperationWithBlock函数不能保证block里面的语句是在主线程中运行的,UILabel显示文字属于UI更新,必须要在主线程进行,否则会有未知的操作,无法在界面上及时正常显示。
解决方法是将UI更新的代码写在主线程上。代码同步到主线程上主要有3种方法:NSThread、NSOperationQueue和GCD,3个层次的多线程都可以获取主线程并同步。
2.
CATransition中过渡类型动画有哪几种type?正确答案:CATransition是CoreAnimation框架提供的转场动画类。开发者可以通过一组预定义的转换或者定制的CIFilter实例来指定转场效果。下面的代码演示了当单击tabBar按钮时的界面切换动画。
-(void)tabBar:(UITabBar*)tabBardidSelectItem:(UITabBarItem*)item{
CATransition*animation=[CATransitionanimation];
animation.duration=0.5:
/*指定效果*/
animation.type=@"reveal";
/*指定效果展示方向*/
animation.subtype=@"fromBottom";
[self.view.layeraddAnimation:animationforKey:nil];
}
其中的type属性是一个NSString类型的字符串,指定了转场动画的类型。它有4个效果可供选择:
1)fade:淡入淡出的过渡效果。对应常量kCATransitionFade。
2)moveIn:新视图移动到旧视图的上面。对应常量kCATransitionMoveIn。
3)push:新视图将旧视图推出窗口。对应常量kCATransitionPush。
4)reveal:旧视图移开显示下面的新视图。对应常量kCATransitionReveal。
需要注意的是,以上4种效果都暴露在CATransition的.h头文件中,可以安全使用。除此之外,还有一些效果属于iOS私有的API,在使用这些效果后,应用在审核时有一定被拒绝的风险。这些效果包括:
1)cube:立方体效果。
2)oglFlip:翻转效果。
3)suckEffect:收缩效果。
4)rippleEffect:水滴波纹效果。
5)pageCurl:向上翻页效果。
6)pageUnCurl:向下翻页效果。
7)cameraIrisHollowOpen:摄像头打开效果。
8)cameraIrisHollowClose:摄像头关闭效果。
3.
GCD中有哪几种队列?正确答案:在GCD中,派发队列(DispatchQueue)是最重要的概念之一。派发队列是一个对象,它可以接受任务,并将任务以FIFO(先进先出)的顺序来执行。派发队列可以是并发的或串行的。并发队列可以执行多任务,串行队列同一时间只执行单一任务。在GCD中,有3种类型的派发队列。
1)串行队列。串行队列中的任务按先后顺序逐个执行,通常用于同步访问一个特定的资源。使用dispatch_queue_create函数,可以创建串行队列。
2)并发队列。在GCD中也称为全局并发队列,可以并发地执行一个或者多个任务。并发队列有高、中、低、后台4个优先级别,中级是默认级别。可以使用dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0)函数来获取全局并发队列对象。串行队列和异步队列的区别在于同步执行和异步执行时的表现(见表)。串行队列和异步队列的区别
同步执行异步执行串行队列在当前线程中,FIFO执行在其它线程,FIFO执行并发队列在当前线程中,FIFO执行多条线程,同步执行
3)主队列。它是一种特殊的串行队列。它在应用程序的主线程中用于更新UI。其他的两种队列不能更新UI。使用dispatch_get_main_queue函数,可以获得主队列对象。
4.
如何只通过属性特质的参数来实现公有的getter方法和私有的setter方法?正确答案:首先在不考虑自动合成的情况下,如果实现公有的getter方法,那么要在.h头文件中声明这个getter方法以暴露给外部调用,并在.m文件中进行实现;然后手动在.m文件中写一个私有的setter方法的实现即可,当然私有方法可以在.m的continue区域进行私有方法声明,但是没有必要,只要不在.h文件中声明暴露即可(C++中是要在.m文件最前面声明的,否则要考虑方法调用顺序,在方法实现之前无法被调用)。这里以一个简单的Person类为例说明具体写法,手动实现的方法代码如下:
/*Person.h头文件*/
@interfacePerson:NSObject{
@private
NSString*name;
}
/*声明公有的getter方法*/
-(NSString*)name;
@end
/*Person.m实现文件*/
#import"Person.h"
/*contime私有声明区域*/
@interfacePerson()
/*在.m文件的continue区域声明私有setter方法,通常私有方法不需要声明,可以省略*/
-(void)setName:(NSString*)newName;
@end
/*implementation实现区域*/
@implementationPerson
/*公有的getter方法实现*/
-(NSString*)name{
/*注意这里直接返回实例变量,如果使用,那么相当于getter方法调用自身,此时会造成死循环*/
returnname;
}
/*私有的setter方法实现*/
-(void)setName:(NSString*)newName{
/*注意这里直接给实例变量赋值,如果使用,那么相当于setter方法调用自身,此时会造成死循环*/
name=newName:
}
@end
这样在类外部是可以调用getter方法的,但setter方法只能在本类内部被调用,外部无法找到setter方法。
现在题目要求使用属性的读写语义也就是readwrite和readonly来让编译器自动合成上面的效果,如何实现呢?
实现方法是要在.h头文件和.m实现文件中定义属性变量两次,第一次在.h头文件中使用readonly读写语义让编译器自动合成公有的getter方法,第二次在.m文件中使用readwrite读写语义再让编译器自动合成私有的setter方法。代码如下:
/*Person.h头文件*/
@interfacePerson:NSObject
/*使用readonly,让编译器只合成公有getter方法*/
@property(nonatomic,readonly,copy)NSString*name;
@end
/*Person.m实现文件*/
/*continue私有声明区域*/
@interfacePerson()
/*让编译器再合成私有setter方法,其中readwrite可以省略,因为默认就是readwrite*/
@property(nonatomic,readwrite,copy)NSString*name;
@end
/*implementation实现区域*/
@implementationPerson
/*测试*/
-(void)test{
/*下面两条语句等效,都是调用setter方法,但注意setter方法是私有的,只能在此处调用,在外部无法调用*/
=@"nmne";
[selfsetName:@"name"];
}
@end
5.
在Objective-C中,前置运算和后置运算有什么区别?正确答案:Objective-C支持大部分标准C语言的运算符,其中包含的前置运算符和后置运算符有:++、+、--、-。以++操作为例,对于变量a,当单独使用++a和a++时,它们是没有任何区别的,都是变量a的自增运算。当涉及表达式运算时,这两种情况的计算过程有明显的差别,示例代码如下。
方式一:
inta=10;
++a;//a=11
方式二:
inta=10;
a++;//a=11
方式三:
intb;
inta=10;
b=++a;//a=11,b=11
方式四:
intb;
inta=10;
b=a++;//a=11,b=10
对于方式一和方式二两段代码,其结果是一样的,其效果都是让a的值+1,最后a的值都为11。而方式三和方式四两段代码的执行结果是有明显区别的。方式三代码的作用是先对a执行+1的操作,再将a的值赋值给b。因此,最后a和b的值都是11。方式四代码的作用是先将a的值复制一份寄存,然后对a执行+1的操作,于是a变成11,但是复制出来的值还是10,a++运算完毕后,再将复制出来的值10赋值给b,所以最后变量b的值是10,而变量a的值是11。
总而言之,后置的++运算符是先将变量的值返回,然后自增1;而前置的++运算符,则是先将值自增1,再返回其值。
6.
如何理解多线程?正确答案:多线程(multithreading)指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件的支持而能够在同一时间执行多个线程,进而提升整体处理性能。要深入了解iOS中的多线程技术,先需要了解以下几个概念。
1.进程
每个正在系统上运行的程序都是一个进程。每个进程之间是相互独立的,每个进程均运行在其专用且受保护的内存空间内。进程在系统内存中的关系如图所示。
系统内存中的进程
通过“活动监视器”可以查看Mac系统中开启的所有进程(见图)。
活动监视器中的进程
2.线程
线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。每个进程包含至少一个线程。线程基本上是轻量级的进程,它负责在单个程序中执行多个任务。通常由系统负责多个线程的调度和执行。
需要注意的是,在同一个线程中执行的任务是串行的。也就是说,在同一时间内,一个线程只能执行一个任务。
线程是程序中一个单一的顺序控制流程。在单个程序中同时运行多个线程完成不同的工作,称为多线程。多线程技术主要是为了充分利用CPU,提高程序的执行效率。多线程之间的关系如图所示。
多线程之间的关系
事实上,在同一时间,CPU只能处理一条线程,只有一条线程在执行。多线程的并发执行,其实就是CPU快速地在多条线程之间调度。如果CPU调度线程的速度足够快,那么就会产生多条线程并发执行的假象。
多线程技术的优点如下:
1)可以很大程度上提高程序的执行效率,提高程序的响应速度。
2)使用线程可以把占据时间长的程序中的任务放到后台去处理,这样就不会阻塞程序主线程,用户体验更好(耗时操作会卡住主线程,严重影响UI的流畅度)。
3)提高计算机资源的利用率,如:更加充分利用内存,多CPU计算机上提高CPU利用率。
4)将进程分块,优化简化程序逻辑结构。
多线程技术的缺点如下:
1)多线程程序的代码会更加复杂、难读,增加交接和维护难度。
2)创建和调度线程会有额外的开销,线程越多,开销越大,甚至反而降低程序的性能。
3)通常模型数据是在多个线程间共享的,需要防止线程死锁情况的发生。
因此,在实际使用多线程时,需要适当开启线程,当线程使用完成后,需要及时释放资源。在最新的iOS技术中,已经很少需要直接操作线程了,因为苹果公司已经将大部分复杂的操作封装好。
7.
线程同步有哪些机制?正确答案:现在流行的进程线程同步互斥的控制机制,其实是由最原始、最基本的4种方法(临界区、互斥量、信号量和事件)实现的。
1)临界区:通过对多线程的串行化来访问公共资源或一段代码,速度快,适合控制数据访问。在任意时刻只允许一个线程访问共享资源,如果有多个线程试图访问共享资源,那么当有一个线程进入后,其他试图访问共享资源的线程将会被挂起,并一直等到进入临界区的线程离开,临界在被释放后,其他线程才可以抢占。
2)互斥量:为协调对一个共享资源的单独访问而设计,只有拥有互斥量的线程才有权限去访问系统的公共资源,因为互斥量只有一个,所以能够保证资源不会同时被多个线程访问。互斥不仅能实现同一应用程序的公共资源安全共享,还能实现不同应用程序的公共资源安全共享。
3)信号量:为控制一个具有有限数量的用户资源而设计。它允许多个线程在同一个时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目。
4)事件:用来通知线程有一些事件已发生,从而启动后继任务的开始。
8.
Objective-C和Swift中有重载吗?正确答案:Swift中有重载,但Objective-C中基本不支持重载,事实上Objective-C支持参数个数不同的函数重载。
Swift是基于C语言和Objective-C语言优化后更加完善的新型语言,摆脱了C的兼容性限制,采用安全的编程模式并且增加了一些新的特性使编程更加有趣、友好,适应语言发展的趋势和期望。函数重载作为多态性的一个部分在Swift中是支持的,可能也是考虑到要弥补Objective-C中不完全支持函数重载的这一缺陷。Objective-C不完全支持重载,因为Objective-C学习者应该会发现同一个类中不允许定义函数名相同且参数个数相同的两个函数,无论参数类型和返回值类型相同与否。但是说完全不支持也太绝对,因为Objective-C中允许定义函数名相同但参数个数不同的两个函数,也就是说Objective-C支持参数个数不同的函数重载。例如,可以在一个类中定义两个参数个数不同的函数,调用时通过参数个数进行区分。
重载函数定义如下:
-(void)test:(int)one;
-(void)test:(int)oneandTwo:(int)two;
重载函数实现如下:
-(void)test:(int)one{
NSLog(@"oneparameter!");
}
-(void)test:(int)oneandTwo:(int)two{
NSLog(@"twoparameters!");
}
多态调用:
[selftest;1];
//output:oneparameter!
[selftest:1andTwo:2];
//output:twoparameter!
可以看出Objective-C可以通过参数个数实现函数重载,但是如果参数相同,那么无论参数和返回值类型相同与否,都无法编译通过。下面的定义是无法通过Xcode编译的。
-(void)test:(int)one;
-(int)test:(float)one;
//Duplicatedeclarationofmethod'test'
9.
项目中什么时候选择使用GCD?什么时候选择NSOperation?正确答案:下图简单概括了NSOperation和GCD各自的特点。NSOperation是对线程的高度抽象,提供Objective-C语言接口,具备面向对象特性(复用、封装),可子类化NSOperation进行操作对象的复用,使程序逻辑结构更清晰。比起GCD,NSOperation可以直接设置操作之间的依赖关系实现线程同步,而且可以通过调用cancel方法中途取消操作,而在GCD中不可取消。NSOperation的线程逻辑控制更加精细灵活,同时复杂度较GCD要高,因此建议在有特殊需求的复杂项目中使用。
NSOperation和GCD的特点
GCD的最大优点是非常简单、易用,经过了官方的优化更加安全高效(多数函数是线程安全的)。对于不复杂的多线程操作,会节省代码量,尤其block参数的使用,使代码更为易读,建议在简单项目中广泛使用。
10.
如何理解MVC设计模式?正确答案:MVC全名是ModelViewController,是模型(Model)一界面视图(View)一控制器(Controller)的缩写,它是一种软件设计规范,用一种将业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到Controller中,在改进和个性化定制界面及用户交互的同时,不需要编写业务逻辑。可以用下图来描述通过控制器实现的视图到模型的交互过程。
MVC设计模式结构
1.模型对象
模型对象封装了应用程序的数据,并定义了操控和处理该数据的逻辑和运算规则。用户在视图层中所进行的创建或者修改数据的操作,会通过控制器对象传达出去,最终会创建或更新模型对象。另外,当模型对象更改时(例如,通过网络连接接收到新数据),模型对象会通知控制器对象,控制器对象更新相应的视图对象。被模型返回的数据是中立的,也就是说模型和数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需要写一次就可以被多个视图重用,所以减少了代码的重复性。
2.视图对象
视图对象是应用程序中用户可以看到并且能够与之交互的界面。视图对象对外提供显示自身和响应用户操作的接口。视图对象的主要作用就是显示来自应用程序模型对象的数据,并使该数据可被编辑。在iOS应用程序开发中,所有的控件、窗口等都继承自UIView,对应于MVC中的View。
3.控制器对象
在应用程序的一个或多个视图对象和一个或多个模型对象之间,控制器对象充当媒介。因此,控制器对象是同步管理程序,通过控制器对象,视图对象了解模型对象的更改,反之亦然。控制器对象还可以为应用程序执行设置和协调任务,并管理其他对象的生命周期。控制器对象解释在视图对象中进行的用户操作,并将新的或更改过的数据传达给模型对象。模型对象更改时,一个控制器对象会将新的模型数据传达给视图对象,以便视图对象可以显示它。
MVC设计模式的低耦合性、高重用性、可维护性等优点显而易见,使得原本复杂的代码与界面的交互变得简单、清晰、明了,开发者可以把更多的精力放在前端界面的设计上,而不用绞尽脑汁去思考究竟应该如何使界面得到同步,这样减轻了设计压力,也从另一方面使用户得到更多更好的享受体验。事实上,MVC设计模式也是苹果公司推荐并在大量实践的设计模式。例如,对于不同的UIView类型的视图对象,都有相应地控制器对象(即UIViewController)与之对应。例如,常用的视图类UITableView,它所对应的控制器对象就是UITableViewController类对象。
11.
什么是线程?线程与进程有什么区别?为什么要使用多线程?正确答案:线程指程序在执行过程中,能够执行程序代码的一个执行单元。线程主要有4种状态:运行、就绪、挂起、结束。
进程指一段正在执行的程序。而线程有时候也被称为轻量级进程,是程序执行的最小单元。一个进程可以拥有多个线程,各个线程之间共享程序的内存空间(代码段、数据段和堆空间)及一些进程级的资源(例如打开的文件),但是各个线程拥有自己的栈空间。进程与线程的关系如图所示。
进程与线程的关系
在操作系统级别上,程序的执行都是以进程为单位的,而每个进程中通常都会有多个线程互不影响地并发执行,那么为什么要使用多线程呢?其实,使用多线程为程序研发带来了巨大的便利。具体而言,有以下几个方面的内容:
1)使用多线程可以减少程序的响应时间。在单线程(单线程指程序执行过程中只有一个有效操作的序列,不同操作之间都有明确的执行先后顺序)的情况下,如果某个操作很耗时,或者陷入长时间的等待(如等待网络响应),那么此时程序将不会响应鼠标和键盘等操作,使用多线程后,可以把这个耗时的线程分配到一个单独的线程去执行,使得程序具备了更好的交互性。
2)与进程相比,线程的创建和切换开销更小。由于启动一个新的线程必须给这个线程分配独立的地址空间,建立许多数据结构来维护线程代码段、数据段等信息,而运行于同一进程内的线程共享代码段、数据段,所以线程的启动或切换的开销比进程要少很多。同时多线程在数据共享方面效率非常高。
3)多CPU或多核计算机本身就具有执行多线程的能力,如果使用单个线程,那么将无法重复利用计算机资源,造成资源的巨大浪费。因此,在多CPU计算机上使用多线程能提高CPU的利用率。
4)使用多线程能简化程序的结构,使程序便于理解和维护。一个非常复杂的进程可以分成多个线程来执行。
12.
如何查看设备应用的crash日志?正确答案:对于一般可重现的bug,可以通过再次运行应用找到问题所在。但是对于某些偶尔出现的错误,尤其是内存错误就很难定位了,因为再次运行可能错误不会再次出现,所以需要通过查看crash日志,来定位当时发生错误的位置。
crash日志可以分成两种:一种是应用发布AppStore后,用户的crash日志会上传,开发者可以在iTunesConnect上查看,但前提是用户在手机设置中开启了“诊断与用量”选项,用户同意分享应用崩溃日志等信息给开发者(具体位置位于:设置→隐私→诊断与用量)。
另一种是开发者在开发测试时查看crash日志信息。查看测试过程中的日志也有多种途径,例如运行时可以连接Mac(模拟器或真机调试)在本地目录中查看:~/Library/Logs/CrashReporter/MobileDevice/设备名称/。日志文件扩展名为.crash或.ips,如图所示。
日志文件
还有主要是在Xcode中查看日志,位置位于Xcode中Window导航栏下的Devices选项,打开会有模拟器和真机的设备列表。选中设备,在有日志的情况下会有ViewDeviceLogs选项,如图所示。
Xcode中查看日志
13.
进程与线程有什么区别?正确答案:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,它是系统进行资源分配和调度的一个独立单位。例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,包括各种表格、内存空间、磁盘空间、I/O设备等,然后该进程被放入到进程的就绪队列,进程调度程序选中它,为它分配CPU及其他相关资源,该进程就被运行起来。
线程是进程的一个实体,是CPU调度和分配的基本单位。线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器、一组寄存器和栈),但是它可以与同属一个进程的其他的线程共享进程所拥有的全部资源。在没有实现线程的操作系统中,进程既是资源分配的基本单位,又是调度的基本单位,它是系统中并发执行的单元。而在实现了线程的操作系统中,进程是资源分配的基本单位,而线程是调度的基本单位,是系统中并发执行的单元。
引入线程主要有以下4个方面的优点:
1)易于调度。
2)提高并发性。通过线程可以方便有效地实现并发。
3)开销小。创建线程比创建进程要快,所需要的开销也更少。
4)有利于发挥多处理器的功能。通过创建多线程,每个线程都在一个处理器上运行,从而实现应用程序的并行,使每个处理器都得到充分运行。
需要注意的是,尽管线程与进程很相似,但两者也存在着很大的不同,区别如下:
1)一个线程必定属于也只能属于一个进程;而一个进程可以拥有多个线程并且至少拥有一个线程。
2)属于一个进程的所有线程共享该进程的所有资源,包括打开的文件、创建的Socket等。不同的进程互相独立。
3)线程又被称为轻量级进程。进程有进程控制块,线程也有线程控制块。但线程控制块比进程控制块小得多。线程间切换代价小,进程间切换代价大。
4)进程是程序的一次执行,线程可以理解为程序中一个程序片段的执行。
5)每个进程都有独立的内存空间,而线程共享其所属进程的内存空间。
14.
如何理解drawRect:方法?正确答案:iOS的绘图操作是发生在UIView类的drawRect:方法中的。如果想在UIView中绘图,那么可以通过继承UIView类并实现其drawRect:方法,在drawRect:方法中获取当前的环境上下文(context)进行绘制。drawRect:方法被定义在UIView的UIViewRendering类别中:
-(void)drawReet:(CGRect)rect;
drawRect:里面的代码利用CoreGraphics在指定的rect中绘制图形,然后内容就会被缓存起来直到它需要被更新。事实上,苹果公司并不建议开发者主动调用drawRect:方法,当然如果强制直接调用该方法,那么也是没有效果的,因为系统此时不会自动创建和View相关联的上下文。而且当没有自定义绘制任务时,就不要在子类中写一个空的drawRect:,否则会造成CPU资源和内存的浪费。
当视图在屏幕中出现的时候,drawRect:方法就会被自动调用。具体是,drawRect:方法的第一次调用是在控制器中loadView和viewDidLoad两方法之后。所以不必担心在控制器初始化之前,drawRect:就会被执行。虽然drawRect:是UIView类中的方法,但事实上都是底层的CALayer对象安排了重绘工作并保存了绘制好的内容。
另外,可以调用setNeedsDisplay:方法将绘制好的图形更新到视图上。setNeedsDisplay:方法就是在receiver上设置一个需要被重新绘制的标记,在下一个绘制周期自动进行重绘,一般iPhone的刷新频率为60Hz,也就是说1/60s后重绘。示例代码如下:
-(void)drawRect:(CGRect)rect{
/*获取上下文*/
CGContextRefctx=UIGraphicsGetCurrentContext();
/*绘制一个圆形*/
CGContextAddEllipseInRect(ctx,CGRectMake(0,0,200,200));
/*设置颜色*/
[[UIColorredColor]set];
/*填充*/
CGContextFillPath(ctx);
}
15.
viewDidLoad和viewDidAppear的区别是什么?正确答案:当界面第一次从xib文件或者storyboard加载界面,或者手写代码创建窗口从loadView加载界面时,才会调用viewDidLoad回调方法,而viewDidAppear方法在每次界面出现时都会调用,包括第一次加载,或者跳转离开后又跳转回来时。
从服务器加载数据的代码写在何处取决于具体需求,如果所用的数据在第一次加载后便不会再改变,那么可以在viewDidLoad中进行请求。如果界面加载后服务器数据可能会变,又必须保证当前界面的数据是最新的,那么当重新回到界面时就要重新加载最新数据,应该将数据请求代码写在viewDidAppear回调方法中。
16.
UIButton到NSObject之间的继承关系是怎样的?正确答案:UIButton继承自UIControl,UIControl继承自UIView,UIView继承自UIResponder,UIResponder继承自最基本的类NSObject。继承结构如图所示。
UIButton到NSObject继承结构
UIButton是一个控件,它具备“按下”等具体的动作操控,而不仅仅是一个简单的静态组件(如UILabel),从这个角度来看UIButton肯定是继承自UIControl的;UIControl继承自UIView,它将UIView的复杂的触摸事件封装成了像“TouchDown”“EditingDidBegin”“TouchDragEnter。”等具体的UIControlEvent事件,其他继承自UIControl的控件还有UISwitch、UITextField、UISlider、UISegmentedControl、UIPageControl等。最后UIView、UICiontrol等都是可交互的元素,它们必然都继承自UIResponder,UIResponder继承自根类NSObject。
17.
HTTPS协议与HTTP协议有什么区别与联系?正确答案:HTTP协议被用于在Web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,那么就可以直接读懂其中的信息。因此,HTTP协议不适合传输一些敏感信息,如信用卡号、密码等。
为了解决HTTP协议的这一缺陷,需要使用另一种协议:安全套接字层超文本传输协议(HTTPS)。为了数据传输的安全,HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为以下4点:
1)HTTPS协议需要从CA(CertificateAuthority)申请一个用于证明服务器用途类型的证书,一般免费证书很少,需要交费。
2)HTTP是超文本传输协议,信息是明文传输,HTTPS则是具有安全性的SSL加密传输协议。
3)HHTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4)HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
18.
按照默认法则,哪些关键字生成的对象需要手动释放?正确答案:起初在MRC(手动引用计数)中开发者要自己手动管理内存,基本原则是:谁创建,谁释放,谁引用,谁管理。其中,创建主要始于关键词new、alloc和copy的使用,创建并持有开始引用计数为1,如果引用要通过发送retain消息增加引用计数,通过发送release消息减少引用计数,那么引用计数变为0后对象会被系统清理释放。现在有了ARC(自动引用计数)后编译器会自动管理引用计数,开发者不再需也不可以手动管理引用计数。
使用new、alloc、copy关键字生成的对象和retain了的对象需要手动释放。被设置为autorelease的对象不需要手动释放,会直接进入自动释放池。
19.
当使用block时,什么情况会发生引用循环?如何解决?正确答案:常见的使用block引起引用循环的情况为:在一个对象中强引用了一个block,在该block中又强引用了该对象,此时就出现了该对象和该block的循环引用。示例代码如下:
/*Test.h*/
#import<Foundation/Foundation.h>
/*声明一个名为MYBlock的block,参数为空,返回值为void*/
typedefvoid(^MYBlock)();
@interfaceTest:NSObject
/*定义并强引用一个MYBlock*/
@property(nonatomic,strong)MYBlockblock;
/*对象属性*/
@property(nonatomic,copy)NSString*name;
-(void)print;
@end
/*Test.m*/
#import"Test.h"
@implementationTest
-(void)ptint{
self.block=^{
NSLog(@"%@",);
};
self.block();
}
@end
解决上面的引用循环的方法有以下两种:一是强制将一方置nil,破坏引用循环;二是将对象使用__weak或者__block修饰符修饰之后再在block中使用(注意是在自动引用计数下),代码如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年传染病防控法律法规保障机制
- 2026年小学数学教育与书法教育的有机结合
- 2026年中班上学期科学领域教学工作总结
- 2026年哮喘中医冬病夏治专题讲座
- 2026年应急通信新技术新装备应用手册
- 击剑馆赛事组织协议2026年全新
- MCN体育赛事合作协议
- 水电安装工程验收标准协议
- 线上保险流动性风险预防合同
- 2026年管理者如何有效辅导与培养下属
- 《社会保障学》医疗保险-课件
- 领导干部忏悔书
- 分子生物学实验
- 立体构成(高职艺术设计)PPT完整全套教学课件
- 《人体发育学》课程考试复习题库(含答案)
- 霍山石斛教学课件
- GB/T 31359-2015半导体激光器测试方法
- GA/T 1773.1-2021机动车驾驶人安全文明操作规范第1部分:通用要求
- FZ/T 07008-2020定形机热平衡测试与计算方法
- 被动语态游戏教育课件
- 火花源原子发射光谱分析课件
评论
0/150
提交评论