二:无限轮播器的实现机理
http://www.bkjia.com/IOSjc/1020086.html
八:使用地图的时候,经常使用其什么功能,需要注意些什么?
(1)使用地图定位的时候需要注意的问题
注意点:使用corelocation框架; 1.plist文件中添加字段(检索)和代码授权,保护用户隐私2.联网3.模拟器没有位置需要自己添加4.切换模拟器才ok
(2)地理与反地理编码
注意点:使用corelocation框架,地理编码指地理名转换为经纬度,使用geocodeAddressString方法;反地理编码指经纬度转换为地理名,使用reverseGeocodeLocation方法
(3)地图展示
注意点:使用corelocation,
MapKit框架;注意在info.plist文件中添加两个字段,既一直允许定位和当使用时添加定位
(4)定位追踪
注意点:就是一个属性
(5)自定义大图针的详情视图
注意点:核心思路:创建一个新的大头针视图展示在点击的相同的位置,并且添加这个大头针视图到地图上
(6)划线功能
注意点:1:在请求对象中封装起点和终点2:通过代理返回一个”折线渲染器”来决定线的宽度和颜色等信息
九:面向对象的的三大特性(OC的三大特性)
面向对象的三大特性:封装,继承,多态
1>封装:set方法
2>作用:提供一个方法给外界设置成员变量值,可以在方法里面对参数进行相应过滤
3>方法名必须以set开头
4> set后面跟上成员变量的名称,成员变量的首字母必须大写
5>返回值一定是void
6>一定要接收一个参数,而且参数类型跟成员变量类型一致
7>形参的名称不能跟成员变量名一样
get方法:
1>作用:返回对象内部的成员变量
2>肯定有返回值,返回值类型肯定与成员变量类型一致
3>方法名跟成员变量名一样
4>不需要接收任何参数
继承:当某个类继承了父类就拥有了父类的所有成员变量和方法,同时也可以扩充方法,基本上所有的类都继承NSObject,同时子类也也可以重写父类的方法,父类必须声明在子类的前面,子类不能拥有和父类相同的成员变量,调用某个方法时,优先去当前类中找,如果找不到,就去父类中找
多态:简单来说就是父类的指针指向子类对象,但是父类类型的变量不能直接调用子类特有的方法。必须强转为子类类型变量后,才能直接调用子类特有的方法
KVO的使用场景
KVO用于监听对象属性的改变。
1下拉刷新、下拉加载监听UIScrollView的contentoffsize;
2webview混排监听contentsize;
3监听模型属性实时更新UI;
4监听控制器frame改变,实现抽屉效果
KVC的使用场景
KVC使用起来比较简单,但是它如何查找一个属性进行读取呢?具体查找规则(假设现在要利用KVC对a进行读取):
1如果是动态设置属性,则优先考虑调用setA方法,如果没有该方法则优先考虑搜索成员变量_a,如果仍然不存在则搜索成员变量a,如果最后仍然没搜索到则会调用这个类的setValue:forUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能正确设置);
2如果是动态读取属性,则优先考虑调用a方法(属性a的getter方法),如果没有搜索到则会优先搜索成员变量_a,如果仍然不存在则搜索成员变量a,如果最后仍然没搜索到则会调用这个类的valueforUndefinedKey:方法(注意搜索过程中不管这些方法、成员变量是私有的还是公共的都能正确读取);
十一:GCD和nsoperation对比一下
<1>GCD
GCD是iOS4.0推出的,主要针对多核cpu做了优化,是C语言的技术
GCD是将任务(block)添加到队列(串行/并行/全局/主队列),并且以同步/异步的方式执行任务的函数,任务的取出遵循队列的FIFO原则:先进先出,后进后出
GCD提供了一些NSOperation不具备的功能
一次性执行:可以保证某一段代码在程序运行的过程中只被执行一次;一次性执行是线程安全的,在多线程环境下也是只执行一次;应用场景:设计单例模式
延迟执行:既实现等待多长时间后在哪个队列中执行什么代码块
调度组:监听一组异步任务执行结束之后,我们能够得到统一的通知;注意:在其调度组内的任务执行完毕后执行后面的”刷新主界面”方法与”玩完”之间的执行没有先后顺序;例如:dispatch_group_notify(group,dispatch_get_main_queue(), ^{
//更新UI控件,提示用户
NSLog(@"刷新主界面");
});
NSLog(@"玩完");
<2>NSOperation
NSOperation是iOS2.0推出的,iOS4.0之后重写了NSOperation
NSOperation将操作(异步的任务)添加到队列(并发队列),就会执行指定操作的方法
NSOperation里提供的方便的操作
最大并发数,
队列的暂定/继续
取消队列中所有的操作
指定操作之间的依赖关系(GCD可以用同步实现,但是比较麻烦)
•同步和异步决定了要不要开启新的线程(同步不开,异步开)
同步:在当前线程中执行任务,不具备开启新线程的能力
异步:在新的线程中执行任务,具备开启新线程的能力
•串行和并发决定了任务的执行方式
并发:多个任务并发(同时)执行
串行:一个任务执行完毕后,再执行下一个任务
•当任务是异步的时候,队列决定了开启多少条线程
串行队列:只开一条
并发队列:可以开启多条
•主队列特点:主队列中的任务,只有主线程空闲的时候才会调度任务执行
主队列又叫全局串行队列,程序启动的时候就创建了主队列,在使用的时候不需要创建,直接GET.主队列中的任务是要在主线程执行的.
•主队列,异步任务
不开线程,同步执行
•主队列,同步执行
程序执行不出来(死锁)
死锁的原因,当程序执行到下面这段代码的时候
主队列:如果主线程正在执行代码,就不调度任务
同步执行:如果第一个任务没有执行,就继续等待第一个任务执行完成,再执行下一个任务此时互相等待,程序无法往下执行(死锁)
dispatch_sync(dispatch_get_main_queue(),^{
NSLog(@"%@ -- %d",[NSThreadcurrentThread],i);
});
•主队列和串行队列的区别
串行队列:必须等待一个任务执行完成,再调度另一个任务
主队列:以先进先出调度任务,如果主线程上有代码在执行,主队列不会调度任务
•(主队列,同步执行)放入异步执行解决死锁
dispatch_async(dispatch_get_global_queue(0,0), ^{
NSLog(@"全局队列,异步执行%@",[NSThread currentThread]);
//此时这行代码在子线程中运行,同步执行不用等待主线程执行此同步执行的任务
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"主队列,同步执行%@",[NSThread currentThread]);
});
NSLog(@"==");
});
•全局队列本质就是并发队列
dispatch_get_global_queue(0,0);
•全局队列和并发队列的区别
并发队列有名称,可以跟踪错误,全局队列没有
全局队列在ARC中不需要考虑释放内存,dispatch_release(q);不允许调用。并发队列在MRC中需要手动释放内存,因为并发队列是create创建出来的在MRC中见到create就要release,全局队列不需要release(只有一个)
一般我们使用全局队列,因为使用起来更加简单
<3>综合比较其各自使用范围如下
性能:①:GCD更接近底层,而NSOperationQueue则更高级抽象,所以GCD在追求性能的底层操作来说,是速度最快的。这取决于使用Instruments进行代码性能分析,如有必要的话
②:从异步操作之间的事务性,顺序行,依赖关系。GCD需要自己写更多的代码来实现,而NSOperationQueue已经内建了这些支持
③:如果异步操作的过程需要更多的被交互和UI呈现出来,NSOperationQueue会是一个更好的选择。底层代码中,任务之间不太互相依赖,而需要更高的并发能力,GCD则更有优势
十五:OC属性修饰符
访问修饰符:用来修饰属性.可以限定对象的属性在那1段范围之中访问.
•@private:私有被@private修饰的属性只能在本类的内部访问.只能在本类的方法实现中访问.
•@protected:受保护的.被@protected修饰的属性只能在本类和本类的子类中访问.只能在本类和子类的方法实现中访问.
•@package:被@package修饰的属性可以在当前框架中访问.
@public:公共的.被@public修饰的属性可以在任意的地方访问.
十六:重写,覆盖,重载,多态之间的差别
首先注意:
(1)重载概念只出现在java和c++中,在c语言和oc中没有重载这个概念,重写和多态在oc中才有
override->重写(=覆盖)、overload->重载、polymorphism
->多态
(2)override是重写(覆盖)了一个方法,以实现不同的功能。一般是用于子类在继承父类时,重写(重新实现)父类中的方法。
重写(覆盖)的规则:
1、重写方法的参数列表必须完全与被重写的方法的相同,否则不能称其为重写而是重载.
2、重写方法的访问修饰符一定要大于被重写方法的访问修饰符(public>protected>default>private)。
3、重写的方法的返回值必须和被重写的方法的返回一致;
4、重写的方法所抛出的异常必须和被重写方法的所抛出的异常一致,或者是其子类;
5、被重写的方法不能为private,否则在其子类中只是新定义了一个方法,并没有对其进行重写。
6、静态方法不能被重写为非静态的方法(会编译出错)。
(3)
多态的概念比较复杂,有多种意义的多态,一个有趣但不严谨的说法是:继承是子类使用父类的方法,而多态则是父类使用子类的方法。
一般,我们使用多态是为了避免在父类里大量重载引起代码臃肿且难于维护。
overload是重载,一般是用于在一个类内实现若干重载的方法,这些方法的名称相同而参数形式不同。
重载的规则:
1、在使用重载时只能通过相同的方法名、不同的参数形式实现。不同的参数类型可以是不同的参数类型,不同的参数个数,不同的参数顺序(参数类型必须不一样);
2、不能通过访问权限、返回类型、抛出的异常进行重载;
3、方法的异常类型和数目不会对重载造成影响;
十八:.h中的变量外界可以直接访问么?(注意是变量,不是property)
答:http://www.cnblogs.com/wangerxiansheng/p/4296797.html
方法的创建:
.h声明文件只定义方法的格式。并不去实现方法体。
方法- (void)setAge: (int)age;表示定义一个动态方法,返回值为void型,方法名是setAge:,参数类型为int型,参数名为age。
注意:在OC中
“-”:动态方法(对象的方法);“+”:静态方法(类的方法)。
一个参数一个冒号,方法名包括冒号(方法名为setAge:)。
在.h文件中定义的方法默认都是public类型的,不能更改。若要定义私有方法,则应该直接在.m文件定义并实现。
OC定义方法时,返回值类型和参数类型都必须放在括号()里。
定义成员变量:
成员变量的作用域有3种:
@public全局都可访问;
@protected本类和子类可访问;
@private只有本类可以访问。
在.h文件中声明的成员变量默认都是@protected型的。
注意:成员变量是声明在.h文件中的{}内部的。也可以说声明成员变量时必须用{}包住!
十九:1.什么是arc?(arc是为了解决什么问题诞生的?)
首先解释ARC: automatic reference counting自动引用计数。
ARC几个要点:
在对象被创建时retain count +1,在对象被release时retain count -1.当retain count为0时,销毁对象。
程序中加入autoreleasepool的对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁。
那么ARC是为了解决什么问题诞生的呢?这个得追溯到MRC手动内存管理时代说起。
MRC下内存管理的缺点:
1.当我们要释放一个堆内存时,首先要确定指向这个堆空间的指针都被release了。(避免提前释放)
2.释放指针指向的堆空间,首先要确定哪些指针指向同一个堆,这些指针只能释放一次。(MRC下即谁创建,谁释放,避免重复释放)
3.模块化操作时,对象可能被多个模块创建和使用,不能确定最后由谁去释放。
4.多线程操作时,不确定哪个线程最后使用完毕
二十:请解释以下keywords的区别:assignvs weak, __block vs __weak?
assign适用于基本数据类型,(iOS中的垃圾处理机制是根据一个对象的索引数来处理的,为0的时候表示没有地方使用该对象,则该对象将被清除,而基本数据类型不属于对象,它的创建和使用都是在内存中,超出对应方法体即被清除,所以不需要使用垃圾处理机制,无需记录索引值,所以使用assgin);
assign其实也可以用来修饰对象,那么我们为什么不用它呢?因为被assign修饰的对象在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil。如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
weak是适用于NSObject对象,并且是一个弱引用。而weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。
首先__block是用来修饰一个变量,这个变量就可以在block中被修改(参考block实现原理)
__block:使用__block修饰的变量在block代码快中会被retain(ARC下,MRC下不会retain)
__weak:使用__weak修饰的变量不会在block代码块中被retain
同时,在ARC下,要避免block出现循环引用__weak typedof(self)weakSelf = self;
二十一:基本数据类型与对象有何不同?
行为:
基本类型只是一个值,没有任何行为
对象类型有自己的行为
内存分配:
基本类型在栈内分配
对象在堆内分配
对象引用保存在栈内
引用与值:
基本类型是值类型,仅表示一个值,保存在栈内
引用类型分两部分,对象引用保存在栈内,对象保存在堆内,
访问变量,是使用的引用找对象
二十二:使用nonatomic一定是线程安全的吗?
不是的。
Atomic原子操作,系统会为setter方法加锁。具体使用@synchronized(self){//code }
nonatomic不会为setter方法加锁。
atomic:线程安全,需要消耗大量系统资源来为属性加锁
nonatomic:非线程安全,适合内存较小的移动设备
二十三:与后台进行数据交互的时候遇到过什么问题么?
答:报错3840因为AFN框架不能解析未做处理的json数据,出现这种情况时,一般是json数据中的不规范造成的,json数据中也许有转义字符的出现导致了这种情况,如有/t/n/0等出现,把解析得到的NSData数据解析成为字符串形式,判断数据中是否含有这些转义字符,含有的话用空字符串替换掉,再把字符串转换为NSData类型的数据,然后进行解析为JSon数据
数据不太规范解决方法:1.后台修改数据
报错404网址有错误,连接不到网页
二十四:简单谈一下你对runtime的理解以及其应用案例
http://www.jianshu.com/p/a31edc4400a1
http://www.cocoachina.com/ios/20160406/15733.html
二十五:数据转模型矿架MJExtension的理解
http://www.jianshu.com/p/93c242452b9b
二十六: 3.UIView与CALayer有什么区别?
1)UIView属于UIKit框架,CALayer属于QuartzCore框架;
2)CALayer比UIView更加轻量级别,但是可以实现同样的效果;
3)UIView可以处理用户的触摸事件,而CALayer不可以;
4)UIView中有个属性是layer;
5)UIView是视图界面的元素,而CALayer是绘制内容;
二十七:#import和#include的区别?@class的作用?
#import完整的包含某个文件的内容,不会引发交叉编译,
#include是C/C++中导入头文件的关键字,完整的包含某个文件的内容,
@class仅仅是声明一个类名,可解决循环包含的问题。
二十八:对于语句NSString *obj =[[NSData alloc] init]; objc在编译时和运行时分别是什么类型的对象?
编译时:NSString;运行时:NSData。
二十九:核心服务层(Core Services Layer):为程序提供基础的系统服务例如网络访问、浏览器引擎、定位、文件访问、数据库访问等,主要包含以下框架:
CFNetwork(网络访问)
Core Data(数据存储)
Core Location(定位功能)
Core Motion(重力加速度,陀螺仪)
Foundation(基础功能如NSString)
Webkit(浏览器引擎)
JavaScript(JavaScript引擎)
媒体层(Media Layer):主要提供图像引擎、音频引擎、视频引擎框架。
图像引擎(Core Graphics、Core Image、Core
Animation、OpenGL ES)
音频引擎(Core Audio、AV
Foundation、OpenAL)
视频引擎(AV Foundation、Core Media)
可触摸层(Cocoa Touch
Layer):主要提供用户交互相关的服务如界面控件、事件管理、通知中心、地图,包含以下框架:
UIKit(界面相关)
EventKit(日历事件提醒等)
Notification
Center(通知中心)
MapKit(地图显示)
Address Book(联系人)
iAd(广告)
Message UI(邮件与SMS显示)
PushKit(iOS8新push机制)
三十:你是怎么保存用户的登录状态的,用户名和密码你是怎么保存的?
http://blog.csdn.net/xn4545945/article/details/36755117
加密,解密的过程,公钥,私钥是如何使用的
http://www.8btc.com/passwordd/
加密的几个阶段
1:简单的对用户名和密码进行MD5加密<可以用暴力碰撞进行破解,因为相同的字符通过哈希算法得到的值是一样的>
2:对用户名和密码进行先加盐(既加一段随机的字符串,也叫token),再进行MD5加密
3:对用户名和密码进行先加盐,然后MD5算法;对得到的数据绑定一个时间戳,再用私钥加密,最后储存到服务器上<用时间+公钥解密与客户端发送的密码进行比较,服务器还要检查发送密码的时间差>
三十一:iOS开发——XML/JSON数据解析
http://www.jianshu.com/p/a54d367adb2a
Json格式:
NSJSONSerialization,官方提供的Json数据格式解析类(在ios9.0以后,苹果用NSURLSession的dataTaskWithRequest方法替代了原先的NSURLConnect的sendSynchronousRequest方法来接收网站返回的response响应,切记虽然用起来步骤比较麻烦,但是效率是最高的)
JSONKit(第三方类库,因为不支持ARC,导入后会报错,不过在target里面的Build Phases中导入-fno-objc-arc,再次编译就好了,效率仅此于原生的)
SBJson(拖入文件中不会报错)
XML格式:
NSXMLParse,官方自带(使用的是sax解析,既逐行解析,采用协议方法进行回调的方法,轻量级的不好内存)
GDataXML,Google提供的开元XML解析库(这是一种dom解析方式,一次性将文件整体导入,在通过查找节点的方式,读取数据;)
三十二:网易新闻头部滚动条的实现过程
http://www.jianshu.com/p/b84f4dd96d0c
打算分为三个部分,滑块部分View,内容显示部分View,包含滑块View和显示内容View的View,以便于可以灵活的使用
1.滑块部分View
1.1要实现滑块可以滚动,考虑可以直接使用collectionView,但是这里还是直接使用scrollView方便里面的控件布局
1.2要实现滑块的点击,可以直接使用UIButton,但是经过尝试,要让button的frame随着文字的宽度来自适应实现比较麻烦,所以选择了使用UILabel添加点击手势来实现点击事件,这里使用了closures来实现(可以使用代理模式)
1.3实现对应的滚动条和遮盖同步移动的效果,文字颜色渐变功能(在点击的时候直接使用一个动画就可以简单的完成了)
2.内容显示部分View
2.1用来作为包含子控制器的view的容器,并且实现可以分页滚动的效果
2.2要实现分页滚动,可以使用UIScrollView来实现,但是这样就要考虑UIScrollView上的各个view的复用的问题,其中细节还是很麻烦,所以直接使用了UICollectionView(利用他的重用机制)来实现
2.3将每一个子控制器的view直接添加到对应的每一个cell的contentView中来展示,所以这里需要注意cell重用可能带来的内容显示不正常的问题,这里采用了每次添加contentView的内容时移除所有的subviews(也可以直接给每个cell用不同的reuseIdentifier实现)
2.4实现实时监控滚动的进度提供给滑块部分来同步调整滚动条和遮盖,文字颜色的渐变,并且在每次滚动完成的时候可以通知给滑块来调整他的内容
3.包含滑块View和显示内容View的View
3.1因为滑块部分View和内容显示部分View是相对独立的部分,在这里只需要实现两者的通信即可
3.2可以自定义滑块部分View和内容显示部分View的frame
三十三:XMPP通讯协议
http://www.jianshu.com/p/3167802eb1e5
即时通讯之环信的应用
http://www.jianshu.com/p/73be68baa1ac
三十五:检测内存泄露的小工具
http://www.cocoachina.com/ios/20160329/15803.html
监测内存泄露的小工具:
block长什么样?它大概长这样子:一个^后面有{和},介于此我们就能查到几乎所有代码里面的block了,那么block里面的self怎么识别?weakSelf算吗,当然不算,按照语法:如果一个self字段它的前后都不是字母数字下划线(好好理解下这句话),那它就是我们要找的self。按着这个思路block里面的self便无所遁形了。然后按着如下写脚本(代码在文末):
(1)遍历工程里面的所有.m文件
(2)查找^
(3)匹配后面的一对{}记住位置
(4)查找{}里面符合规则的self
运行xcode自带的shell脚本
三十六:iOS上传数据到服务器
http://www.jianshu.com/p/e1d59ab0bf1a
结合上面两个方法可知,上传平常的数据和上传图片不一样的地方就是下面这两行代码了,就是在发送POST请求时,请求头里面记录着要上传的是图片还是一般的数据.
上传一般的数据:
[request addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
[request addValue:@"application/json" forHTTPHeaderField:@"Accept"];
上传图片:
[request addValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"]; [request addValue:@"text/html" forHTTPHeaderField:@"Accept"];
深入解析POST上传-->AFNetworking的底层理解
http://www.cnblogs.com/worldtraveler/p/4736643.html
http://www.jianshu.com/p/2b75932d2f92
为何使用AFNetworking
四十:控制器之间跳转的几种方法
http://www.mamicode.com/info-detail-469709.html
四十一:保存用户名和密码
http://blog.sina.com.cn/s/blog_71715bf801018v33.html
四十三:在ARC机制下利用leaks查找内存泄露
http://www.jianshu.com/p/f3d130ff807b
四十四:多线程的几种表达方式
http://www.jianshu.com/p/054723d94f9d
四十五:const char*, char const*, char*const的区别
http://blog.csdn.net/yingxunren/article/details/3968800
四十七:正则表达式(初级学习)
http://www.jianshu.com/p/d332e9fe33f3
自定义iOS7导航栏背景,标题和返回按钮文字颜色
四十九:iOS 绘制1像素的线
http://www.cnblogs.com/smileEvday/p/iOS_PixelVsPoint.html
五十:Label用法总结
http://blog.sina.com.cn/s/blog_bf9843bf0101f7z7.html
#五十二:iOS自定义 中间凸出的 tabbar 仿闲鱼
http://www.jianshu.com/p/d905387797c6