您的位置:首页 > 移动开发 > IOS开发

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

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
}

}

9:和后端服务器是怎么进行交互
需求确定、开发周期定好后,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(),^{

//合并图片
});

10:使用GCD的时候,如何在一个group里添加几个任务的依赖关系(这几个任务放在一个组中)

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执行完毕后,想干嘛就干嘛去吧

});

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

});

}

二:上机题: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

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.什么是键-值,键路径是什么

  模型的性质是通过一个简单的键(通常是个字符串)来指定的。视图和控制器通过键来查找相应的属性值。

  在一个给定的实体中,同一个属性的所有值具有相同的数据类型。键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制。

  键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一起的对象性质序列。

  第一个键的性质是由先前的性质决定的,接下来每个键的值也是相对于其前面的性质。

  键路径使您可以以独立于模型实现的方式指定相关对象的性质。通过键路径,您可以指定对象图中的一个任意深度的路径,使其指向相关对象的特定属性。

五:.目标-动作机制(类似于-观察者,发送者发送的情报)
  目标是动作消息的接收者。一个控件,或者更为常见的是它的单元,以插座变量(参见"插座变量"部分)的形式保有其动作消息的目标。

  动作是控件发送给目标的消息,或者从目标的角度看,它是目标为了响应动作而实现的方法。

  程序需要某些机制来进行事件和指令的翻译。这个机制就是目标-动作机制。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: