ios基础知识整理1
2016-04-25 18:40
573 查看
一:
http://www.henishuo.com/ios-middle-interview-one/?utm_source=tuicool&utm_medium=referral
1:appA:添加appB的白名单,定义appA的urlschemes;
例如:invoking://com.hello/yourpath/?username=WT&password=123456&callback=myapp
其中invoking是URLScheme即[urlscheme],
com.hello是host,即[urlhost],
yourpath是path,即[urlpath],
username=WT&password=123456&callback=myapp是query,即[urlquery]。
2:socket:利用在股票显示k线;
传输过程的数据类型是结构体,按字节流形式传输。
3:图片压缩:
压:
NSData*imgData=UIImageJPEGRepresentation(image,0.5);
缩:
通过
*压缩图片至目标尺寸
*
*@paramsourceImage源图片
*@paramtargetWidth图片最终尺寸的宽
*
*@return返回按照源图片的宽、高比例压缩至目标宽、高的图片
*/
-(UIImage*)compressImage:(UIImage*)sourceImage
toTargetWidth:(CGFloat)targetWidth{
CGSizeimageSize=sourceImage.size;
CGFloatwidth=imageSize.width;
CGFloatheight=imageSize.height;
CGFloattargetHeight=(targetWidth/width)*height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth,targetHeight));
[sourceImagedrawInRect:CGRectMake(0,0,targetWidth,targetHeight)];
UIImage*newImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnnewImage;
}
4:按比例适配
UIViewContentModeScaleAspectFit,//contentsscaledtofitwithfixedaspect.remainderistransparent
UIViewContentModeScaleAspectFill,//contentsscaledtofillwithfixedaspect.someportionofcontentmaybeclipped.
5:如果圆角视图多,用
[/code]
】
将buildsetting中的OptimizationLevel设置为Fastest,Smallest[-Os],在发布模式下,默认就是这样设置的
将buildsetting中的StripDebugSymbolsDuringCopy设置为YES,在发布模式下,默认就是这样设置的
资源文件查找出所有未使用的,去掉这些永远不会使用的资源文件
对嵌入App的音频进行压缩处理
8:版本迭代中,处理版本兼容[版本迭代一定要注意兼容老版本,比如新增了字段或者去掉了某些不再使用的字段,不能引起应用闪退。我们这里只谈程序代码兼容新老版本问题,不考虑业务。因为业务是要求后台来兼容的,通常接口会有版本号控制,用于兼容不同版本的客户端。]
增加程序的健壮性,需要兼容后台的错误【假设接口返回来的数据是这样的,我们需要通过类型判断,确保不会因为接口变化返回无效数据而引起闪退。当然,当接口返回的数据结构与我们原先约定的不一样时,通常是因为后台出错了,因此为了程序更健壮,我们应该要容得下后台的错误:】
AFHTTPRequestOperation
*op=[selfPostRequestWithUrl:url
params:paramscompletion:^(idresponseObject){
BOOLisSuccess=NO;
if([responseObjectisKindOfClass:[NSDictionaryclass]]){
NSDictionary*response=responseObject[@"response"];
if([response
isKindOfClass:[NSDictionaryclass]]){
NSArray*resultList=response[@"resultList"];
if([resultListisKindOfClass:[NSArrayclass]]){
NSArray*listModels=[HYBCosmesisModel
objectArrayWithKeyValuesArray:resultList];
isSuccess=YES;
completion(listModels);
}
}
}
if(!isSuccess){
//表示出错
completion(nil);
}
}errorBlock:^(NSError*error){
errorBlock(error);
}];
而我们在使用的时候,对于字符串、数组、字典都应该要做一下类型判断和空处理。比如:
9:和后端服务器是怎么进行交互
需求确定、开发周期定好后,iOS、安卓及后端各端主要负责人员在了解完需求、分析、讨论、确定需要的接口。在三端统一后,后端接口负责人确定哪天出接口文档及接口假数据。么要三端一起定接口,对原有的业务和原有的接口全部都了解,任何一方的了解加起来才能确定是否可行。
10:怎么用GCD加载多张图片之后,把图片放到融合到一张图片里?
使用DispatchGroup追加block到GlobalGroupQueue,这些block如果全部执行完毕,就会执行MainDispatchQueue中的结束处理的block。
当放到group中的所有请求都完成时,才会回调dispatchgroupnotify的block:
10:使用GCD的时候,如何在一个group里添加几个任务的依赖关系(这几个任务放在一个组中)
dispatch_group_wait(dispatch_group_tgroup,dispatch_time_ttimeout);
这个API是等待group中的所有任务都执行完毕才能继续往下执行其它任务。它是同步地等待任务执行完毕。比如,A、B、C、D四个任务,要求A、B执行完毕后,C、D才能开始执行,那么可以通过这样做:
或者可以这样:
11:使用SDWebImage的时候,从服务器请求回来的头像URL没有变化,但是用户已经修改过头像,由于缓存的原因,不能显示出最新修改的用户的头像。在不去掉缓存的条件下,如何显示出最新的头像,给出策略。
法1:用sd的方法:
-(void)sd_setImageWithURL:(NSURL*)urlplaceholderImage:(UIImage*)placeholderoptions:(SDWebImageOptions)options{
然后option选择SDWebImageRefreshCached=1<<4,
法2:
12:GCD的另一个用处是可以让程序在后台较长久的运行。
w.jianshu.com/p/fba01d38e826
https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW8
二:上机题:http://www.cocoachina.com/ios/20151119/14319.html
三:MJExtension使用详解
/bubuko.com/infodetail-771052.html
四:http://www.swift51.com/swift.htmlswift官网,中文
五:http://www.cocoachina.com/ios/20160323/15770.html
isMemberOfClass和isKindOfClass联系与区别
联系:两者都能检测一个对象是否是某个类的成员
区别:isKindOfClass不仅用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否派生自该类的类的成员,而isMemberOfClass只能做到第一点。
举例:如ClassA派生自NSObject类,ClassA*a=[ClassAalloc]init];,[aisKindOfClass:[NSObjectclass]]可以检查出a是否是NSObject派生类的成员,但isMemberOfClass做不到。
在Objective-C中如何实现KVO
注册观察者(注意:观察者和被观察者不会被保留也不会被释放)
接收变更通知
移除对象的观察者身份
KVO中谁要监听谁注册,然后对响应进行处理,使得观察者与被观察者完全解耦。KVO只检测类中的属性,并且属性名都是通过NSString来查找,编译器不会检错和补全,全部取决于自己。
六:http://www.tuicool.com/articles/BNFRJrB【手势解锁】
七:http://www.cocoachina.com/swift/20160429/16051.html【10个惊艳的Swift单行代码】
八:https://github.com/STShenZhaoliang/STPhotoBrowser.git【类似网易新闻的collectionViewCell的移动】
九:http://code.cocoachina.com/view/130753【导航渐变】
10:http://blog.csdn.net/u012597860/article/details/51383424?ref=myread
深入理解runloop
11:/article/8700260.html
12:http://www.cocoachina.com/programmer/20160513/16243.html正则表达式
13:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/Masonry介绍与使用实践(快速上手Autolayout)
14:http://mt.sohu.com/20160418/n444740029.shtml12道面试题
二:进程和线程的区别:
1:一个进程里有多个线程
2:进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
3:线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
4:但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
三:堆栈区别:
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。
申请大小:栈获得空间较小(系统预先规定),堆获得空间比较灵活,也比较大(系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。)
碎片问题:栈是先进后出,一一对应。堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
四:4.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。
在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。
第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。
键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。
五:.目标-动作机制(类似于-观察者,发送者发送的情报)
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
1:appA:添加appB的白名单,定义appA的urlschemes;
例如:invoking://com.hello/yourpath/?username=WT&password=123456&callback=myapp
其中invoking是URLScheme即[urlscheme],
com.hello是host,即[urlhost],
yourpath是path,即[urlpath],
username=WT&password=123456&callback=myapp是query,即[urlquery]。
2:socket:利用在股票显示k线;
传输过程的数据类型是结构体,按字节流形式传输。
3:图片压缩:
压:
NSData*imgData=UIImageJPEGRepresentation(image,0.5);
1:UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数而
UIImagePNGRepresentation只需要图片引用作为参数.
[这个更佳]
2:UIImagePNGRepresentation(UIImage\*image)要比
UIImageJPEGRepresentation(UIImage*image,1.0)返回的图片数据量大很多.
缩:
通过
[sourceImagedrawInRect:CGRectMake(0,0,targetWidth,targetHeight)]可以进行图片“缩”的功能。
*压缩图片至目标尺寸
*
*@paramsourceImage源图片
*@paramtargetWidth图片最终尺寸的宽
*
*@return返回按照源图片的宽、高比例压缩至目标宽、高的图片
*/
-(UIImage*)compressImage:(UIImage*)sourceImage
toTargetWidth:(CGFloat)targetWidth{
CGSizeimageSize=sourceImage.size;
CGFloatwidth=imageSize.width;
CGFloatheight=imageSize.height;
CGFloattargetHeight=(targetWidth/width)*height;
UIGraphicsBeginImageContext(CGSizeMake(targetWidth,targetHeight));
[sourceImagedrawInRect:CGRectMake(0,0,targetWidth,targetHeight)];
UIImage*newImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
returnnewImage;
}
4:按比例适配
UIViewContentModeScaleAspectFit,//contentsscaledtofitwithfixedaspect.remainderistransparent
UIViewContentModeScaleAspectFill,//contentsscaledtofillwithfixedaspect.someportionofcontentmaybeclipped.
5:如果圆角视图多,用
cornerRadius会导致性能损耗
6:多线程在实际中的应用
网络操作和大量图片处理;
从数据库提取数据,开个子线程,然后将数据分组显示,处理完后再去刷新UI显示;
拍照后,在子线程里处理图片,完成后才回到主线程来显示图片,拍照出来的照片太大了,因此要做处理;
音频、视频处理会在子线程里处理;
做客户端与服务端数据同步时,会在后台闲时自动同步;
多线程GCD(grandcentraldispatch多核编程):http://www.cnblogs.com/pure/archive/2013/03/31/2977420.html
主线程:Mainqueue,通过dispatch_get_main_queue;
并行队列:globaldispatchqueue,通过dispatch_get_global_queue;
串行队列:serialqueue,通过dispatch_queue_create创建。可以使用函数dispatch_retain和dispatch_release去增加或者减少引用计数。
【
//后台执行: dispatch_async(dispatch_get_global_queue(0,0),^{ //something }); //主线程执行: dispatch_async(dispatch_get_main_queue(),^{ //something }); //一次性执行: staticdispatch_once_tonceToken; dispatch_once(&onceToken,^{ //codetobeexecutedonce }); //延迟2秒执行: doubledelayInSeconds=2.0; dispatch_time_tpopTime=dispatch_time(DISPATCH_TIME_NOW,delayInSeconds*NSEC_PER_SEC); dispatch_after(popTime,dispatch_get_main_queue(),^(void){ //codetobeexecutedonthemainqueueafterdelay }); //自定义dispatch_queue_t dispatch_queue_turls_queue=dispatch_queue_create("blog.devtang.com",NULL); dispatch_async(urls_queue,^{ //yourcode }); dispatch_release(urls_queue); //合并汇总结果 dispatch_group_tgroup=dispatch_group_create(); dispatch_group_async(group,dispatch_get_global_queue(0,0),^{ //并行执行的线程一 }); dispatch_group_async(group,dispatch_get_global_queue(0,0),^{ //并行执行的线程二 }); dispatch_group_notify(group,dispatch_get_global_queue(0,0),^{ //汇总结果 }); 一个应用GCD的例子: 异步网络请求数据进行交互[code]dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ NSURL*url=[NSURLURLWithString:@"http://www.baidu.com"]; NSError*error; NSString*data=[NSStringstringWithContentsOfURL:urlencoding:NSUTF8StringEncodingerror:&error]; if(data!=nil){ dispatch_async(dispatch_get_main_queue(),^{ NSLog(@"callback,thedatais:%@",data); }); }else{ NSLog(@"errorwhendownload:%@",error); } });
[/code]
】
7:减少app的大小
将buildsetting中的OptimizationLevel设置为Fastest,Smallest[-Os],在发布模式下,默认就是这样设置的
将buildsetting中的StripDebugSymbolsDuringCopy设置为YES,在发布模式下,默认就是这样设置的
资源文件查找出所有未使用的,去掉这些永远不会使用的资源文件
对嵌入App的音频进行压缩处理
8:版本迭代中,处理版本兼容[版本迭代一定要注意兼容老版本,比如新增了字段或者去掉了某些不再使用的字段,不能引起应用闪退。我们这里只谈程序代码兼容新老版本问题,不考虑业务。因为业务是要求后台来兼容的,通常接口会有版本号控制,用于兼容不同版本的客户端。]
增加程序的健壮性,需要兼容后台的错误【假设接口返回来的数据是这样的,我们需要通过类型判断,确保不会因为接口变化返回无效数据而引起闪退。当然,当接口返回的数据结构与我们原先约定的不一样时,通常是因为后台出错了,因此为了程序更健壮,我们应该要容得下后台的错误:】
AFHTTPRequestOperation
*op=[selfPostRequestWithUrl:url
params:paramscompletion:^(idresponseObject){
BOOLisSuccess=NO;
if([responseObjectisKindOfClass:[NSDictionaryclass]]){
NSDictionary*response=responseObject[@"response"];
if([response
isKindOfClass:[NSDictionaryclass]]){
NSArray*resultList=response[@"resultList"];
if([resultListisKindOfClass:[NSArrayclass]]){
NSArray*listModels=[HYBCosmesisModel
objectArrayWithKeyValuesArray:resultList];
isSuccess=YES;
completion(listModels);
}
}
}
if(!isSuccess){
//表示出错
completion(nil);
}
}errorBlock:^(NSError*error){
errorBlock(error);
}];
而我们在使用的时候,对于字符串、数组、字典都应该要做一下类型判断和空处理。比如:
1 2 3 4 5 6 7 8 9 10 11 12 13 | if([responseisKindOfClass:[NSDictionaryclass]]){ NSString*value=response[@"blogName"]; if(!kIsEmptyString(value)){ //Domyjob } NSArray*array=response[@"array"]; if([array isKindOfClass:[NSArrayclass]]){ //Domyjob } } |
需求确定、开发周期定好后,iOS、安卓及后端各端主要负责人员在了解完需求、分析、讨论、确定需要的接口。在三端统一后,后端接口负责人确定哪天出接口文档及接口假数据。么要三端一起定接口,对原有的业务和原有的接口全部都了解,任何一方的了解加起来才能确定是否可行。
10:怎么用GCD加载多张图片之后,把图片放到融合到一张图片里?
使用DispatchGroup追加block到GlobalGroupQueue,这些block如果全部执行完毕,就会执行MainDispatchQueue中的结束处理的block。
当放到group中的所有请求都完成时,才会回调dispatchgroupnotify的block:
1 2 3 4 5 6 7 8 9 10 | dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_tgroup=dispatch_group_create(); dispatch_group_async(group,queue,^{/*加载图片1 */}); dispatch_group_async(group,queue,^{/*加载图片2 */}); dispatch_group_async(group,queue,^{/*加载图片3 */}); dispatch_group_notify(group,dispatch_get_main_queue(),^{ //合并图片 }); |
dispatch_group_wait(dispatch_group_tgroup,dispatch_time_ttimeout);
这个API是等待group中的所有任务都执行完毕才能继续往下执行其它任务。它是同步地等待任务执行完毕。比如,A、B、C、D四个任务,要求A、B执行完毕后,C、D才能开始执行,那么可以通过这样做:
1 2 3 4 5 6 7 8 9 10 11 | dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_tgroup=dispatch_group_create(); dispatch_group_async(group,queue,^{/* 任务A*/}); dispatch_group_async(group,queue,^{/* 任务B*/}); dispatch_group_notify(group,dispatch_get_main_queue(),^{ dispatch_group_async(group,queue,^{/* 任务C*/}); dispatch_group_async(group,queue,^{/* 任务D*/}); }); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | dispatch_queue_tqueue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0); dispatch_group_tgroup=dispatch_group_create(); dispatch_group_async(group,queue,^{/* 任务A*/}); dispatch_group_async(group,queue,^{/* 任务B*/}); //同步等待A、B执行 dispatch_group_wait(group,DISPATCH_TIME_FOREVER); dispatch_release(group); //重新创建组 group=dispatch_group_create(); dispatch_group_async(group,queue,^{/* 任务C*/}); dispatch_group_async(group,queue,^{/* 任务D*/}); dispatch_group_notify(group,dispatch_get_main_queue(),^{ //C、D执行完毕后,想干嘛就干嘛去吧 }); |
法1:用sd的方法:
-(void)sd_setImageWithURL:(NSURL*)urlplaceholderImage:(UIImage*)placeholderoptions:(SDWebImageOptions)options{
然后option选择SDWebImageRefreshCached=1<<4,
法2:
12:GCD的另一个用处是可以让程序在后台较长久的运行。
w.jianshu.com/p/fba01d38e826
-(void)applicationDidEnterBackground:(UIApplication*)application |
{ |
bgTask=[applicationbeginBackgroundTaskWithName:@"MyTask"expirationHandler:^{ |
//Cleanupanyunfinishedtaskbusinessbymarkingwhereyou |
//stoppedorendingthetaskoutright. |
[applicationendBackgroundTask:bgTask]; |
bgTask=UIBackgroundTaskInvalid; |
}]; |
//Startthelong-runningtaskandreturnimmediately. |
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0),^{ |
//Dotheworkassociatedwiththetask,preferablyinchunks. |
[applicationendBackgroundTask:bgTask]; |
bgTask=UIBackgroundTaskInvalid; |
}); |
} |
三:MJExtension使用详解
/bubuko.com/infodetail-771052.html
四:http://www.swift51.com/swift.htmlswift官网,中文
五:http://www.cocoachina.com/ios/20160323/15770.html
isMemberOfClass和isKindOfClass联系与区别
联系:两者都能检测一个对象是否是某个类的成员
区别:isKindOfClass不仅用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否派生自该类的类的成员,而isMemberOfClass只能做到第一点。
举例:如ClassA派生自NSObject类,ClassA*a=[ClassAalloc]init];,[aisKindOfClass:[NSObjectclass]]可以检查出a是否是NSObject派生类的成员,但isMemberOfClass做不到。
在Objective-C中如何实现KVO
注册观察者(注意:观察者和被观察者不会被保留也不会被释放)
六:http://www.tuicool.com/articles/BNFRJrB【手势解锁】
七:http://www.cocoachina.com/swift/20160429/16051.html【10个惊艳的Swift单行代码】
八:https://github.com/STShenZhaoliang/STPhotoBrowser.git【类似网易新闻的collectionViewCell的移动】
九:http://code.cocoachina.com/view/130753【导航渐变】
10:http://blog.csdn.net/u012597860/article/details/51383424?ref=myread
深入理解runloop
11:/article/8700260.html
iOS开发-----操作通讯录(AddressBook篇)&通讯录UI(AddressBookUI篇)
12:http://www.cocoachina.com/programmer/20160513/16243.html正则表达式13:http://adad184.com/2014/09/28/use-masonry-to-quick-solve-autolayout/Masonry介绍与使用实践(快速上手Autolayout)
14:http://mt.sohu.com/20160418/n444740029.shtml12道面试题
二:进程和线程的区别:
1:一个进程里有多个线程
2:进程有独立的地址空间,一个进程崩溃后,在保护模式下不会对其它进程产生影响,而线程只是一个进程中的不同执行路径。
3:线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序健壮,但在进程切换时,耗费资源较大,效率要差一些。
4:但对于一些要求同时进行并且又要共享某些变量的并发操作,只能用线程,不能用进程。
三:堆栈区别:
管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制;对于堆来说,释放工作由程序员控制,容易产生memoryleak。
栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。
堆:堆是向高地址扩展的数据结构,是不连续的内存区域。
申请大小:栈获得空间较小(系统预先规定),堆获得空间比较灵活,也比较大(系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。)
碎片问题:栈是先进后出,一一对应。堆来讲,频繁的new/delete势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低。
分配方式:堆都是动态分配的,没有静态分配的堆。栈有2种分配方式:静态分配和动态分配。静态分配是编译器完成的,比如局部变量的分配。
分配效率:栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行,这就决定了栈的效率比较高。
四:4.什么是键-值,键路径是什么
模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。
在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。
键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。
第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。
键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。
五:.目标-动作机制(类似于-观察者,发送者发送的情报)
目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)的形式保有其动作消息的目标。
动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。
程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
相关文章推荐
- iOS开发:提取MP3文件中的信息
- BOMStream BOMStreamWithFileAndSys
- [iOS适配-- launchImage]
- iOS公钥 私钥原理以及相关资源
- iOS 2D 绘图(Quartz2D)
- ios block
- 消息推送测试 远程通知
- block语法
- IOS 关键字
- iOS深入学习(Block全面分析)
- 自动布局之masonry
- iOS组件封装与自动布局自定义表情键盘
- Git新电脑从头开始搭建及使用
- iOS开发——点击图片全屏显示
- iOS自定义键盘切换效果
- iOS-开发之 pch 文件的使用
- iOS 打包ipa测试包
- iOS开发——缩放图片
- audio 在ios上自动播放问题
- 【转载】iOS提示框,为什么你应该使用 MBProgressHUD?