工作小知识 总结

Posted *宁宁

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了工作小知识 总结相关的知识,希望对你有一定的参考价值。

1.工程出现内存警告⚠️怎么办?

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
    
    //6.0以后需要手动处理   6.0以前系统自动掉用 viewDidUnload
    if ([self isViewLoaded] && !self.view.window) {
        self.view = nil;
    }
}

 

2.上线的项目出现重大bug如何解决(热修复)

http://blog.csdn.net/zm53373581/article/details/50011521  参考

 

3.工程是怎么适配ipv6的(6月1号起iosapp强制支持ipv6网络)?

更新第三方,如afn,微信等

4.扩展类 属性可以直接用吗?(.m里面设置什么,不设置的话 会崩溃)

 

 5.oc空对象 发消息 会引起崩溃吗?

不会,像java或者c++这样的面向对象的语言如果是空对象发消息会崩溃

 6.数据存储 方式(userdefault 可以存大数据吗)

userdefault,plist,coredata,fmdb,(userdefault 不适合存大数据,因为userdefault 读的时候是全部读出来会浪费很多时间,而像数据库做成表格只读有用的部分,省时)

 7.viewcontroller 的  生命周期  +(void)load;什么时候执行

 

+(void)load;

 

+(void)initialize;

 

-(id)initwith...;

 

-(void)loadview;

 

-(void)viewDidLoad;

 

-(void)viewWillAppear:(BOOL)animated;

 

-(void)viewDidAppear:(BOOL)animated;

 

-(void)viewWillDisappear:(BOOL)animated;

 

-(void)viewDidDisappear:(BOOL)animated;

 

 

这是controller的调用顺序;

 

在Objective-C中,runtime会自动调用每个类的两个方法。+(void)load会在类初始加载时调用,+(void)initialize会在第一次调用类的类方法或实例方法之前被调用。这两个方法是可选的,且只有在实现了它们时才会被调用。
共同点:两个方法都只会被调用一次。

 8.get和post请求的区别,get请求 可以上传一个图片吗

     GET请求, 将参数直接写在访问路径上. 操作简单, 不过容易让外界看到, 安全性不高, 地址最多 255 字节.

     POST 请求, 将参数放到 body 里面, POST请求的操作相对复杂, 需要将参数和地址分开, 不过安全性高,参数放在body里面, 不容易被捕获.(不容易被黑客攻击)

 9.__block    __weak的区别

__block 可以在ARC和MRC 模式下用,可以修饰对象也可以修饰基本数据类型。__block BOOL result = NO;      __block NSString *key = nil;

__weak只能在ARC下使用,只能修饰对象(NSString),不能修饰基本数据类型(int)。__weak NSString * string = [[NSString alloc]initWithFormat:@"1234"];(string 为nil)

__block 修饰的对象可以在block中可以重新赋值,__weak不可以。

__block修饰的变量可以在bloc里面修改;

__weak的作用是防止循环引用,引起内存泄漏的问题,例如:__weak __typeof(self)weakSelf = self;。

PS:__unsafe_unretained 可以视为iOS SDK4.3 以前的__weak的替代品,不过不会自动置空为nil,所以尽量不用这个修饰符。

10.深拷贝和浅拷贝的区别

参考网址:http://www.cocoachina.com/ios/20150908/13240.html

11.在视图上点击一个button,系统是怎么找到这个button并且响应它的响应事件的?

iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入Application的事件队列,单例的UIApplication会从事件队列中取出触摸对象并传递给UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:([self.window hitTest:<#(CGPoint)#> withEvent:<#(nullable UIEvent *)#>];)方法寻找此次Touch操作初始点所在的视图(也就是说处理这次触摸事件的视图),这个过程称之为hit-test view。

3种情况下响应对象不接收触摸事件:

@1:透明度alpha = 0.0-0.01

@2:用户交互属性 userInteractionEnabled = NO;

@3:隐藏hidden = YES;

具体学习网址:http://www.tuicool.com/articles/JfUzUz

 

找到合适的视图控件后,就会调用视图控件的touches方法来处理具体事件

              touchesBegan...

              touchesMoved...

              touchesEnded...

 12.定义一个枚举

 typedef NS_ENUM (NSInteger, OperateDoorType) {
    enum_Operate_OPEN_THE_DOOR = 0,
    enum_Operate_CLOSE_THE_DOOR = 1
};

 13.懒加载

 - (NSArray *)rechargeAmountList {
    if (_rechargeAmountList == nil) {
        _rechargeAmountList = [NSArray array];
    }
    return _rechargeAmountList;
}

 

14.一个对象如果两个线程都要访问,前提是a访问完之后b线程才能访问,怎么解决?(加锁)

方法一,@synchronized(id anObject),(最简单的方法)
会自动对参数对象加锁,保证临界区内的代码线程安全

 

@synchronized(self)

{ // 这段代码对其他 @synchronized(self) 都是互斥的  

 // self 指向同一个对象 

}
 方法二,NSLock
NSLock对象实现了NSLocking protocol,包含几个方法:
lock,加锁
unlock,解锁
tryLock,尝试加锁,如果失败了,并不会阻塞线程,只是立即返回NO
lockBeforeDate:,在指定的date之前暂时阻塞线程(如果没有获取锁的话),如果到期还没有获取锁,则线程被唤醒,函数立即返回NO
比如:

static NSLock* imageLock = nil;

+ (UIImage *)af_safeImageWithData:(NSData *)data {
    UIImage* image = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        imageLock = [[NSLock alloc] init];
    });
    
    [imageLock lock];
    image = [UIImage imageWithData:data];
    [imageLock unlock];
    return image;
}

 此外还有递归锁 、条件锁、分布锁

15.用过的设计模式

@1-MVC模式

model-数据模型 view-视图展示 controller-UI视图和数据交互的逻辑控制器;

(mvc约定,model和view不允许打交道,model是管理数据的,如果model里面的数据发生了变化,与之对应的视图将更新,这需要iOS机制来支持,苹果提供了两种机制:KVO和Notification,KVO可以简单的理解为:为一个关注的key对象添加监听器。Notification当有数据发生变化时,发出广播给所有的检测器)。

    MVC 也约定, View 不允许直接引用Modal, 它只能被Controller 所控制。 Controller 控制 View 显示什么数据。我们知道,View 所要显示的数据是来源于 Modal, View 上产生的事件 ( 比如 Touch事件)需要通知 Controller。 既然MVC 不允许直接打交道,就需要提供一种机制。(Delegate设计模式的引入,就是为了解决UIView与Controller松耦合互动问题。)

 

@2-观察者模式

一般为model层对controller和view进行的通知方式,不关心谁去接收,只负责发布消息。

例如:Notification通知中心,注册通知中心,任何位置可以发送消息,注册观察者的对象可以接收。KVO键值对改变通知观察者。

@3-代理模式

例如tableview的delegate    或者 配合protocol实现代理模式

@4-单例模式

确保程序运行某个类,只有一个实例,用于资源共享。

@5-策略模式

@6-工厂模式

16.mvc的关系图

 如上图

17. UIResponder的子类有哪些

 UIView 和 UIViewController

 18.网络缓存

针对get请求 可以做缓存,post请求是不可以的。下面是get的请求:

    //内存缓存大小 磁盘缓存大小  缓存路径
    NSString * cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSURLCache * cash = [[NSURLCache alloc]initWithMemoryCapacity:4*1024*1024 diskCapacity:20*1024*1024 diskPath:cache];
    [NSURLCache setSharedURLCache:cash];

19.沙盒文件夹分别都是什么作用

默认情况下,每个沙盒含有3个文件夹:Documents,Library和tmp。因为应用的沙盒机制,应用只能在几个目录下肚泻文件;

3个文件夹的作用:

Documents:苹果建议将程序中建立的或者在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括这个目录

Library(下一级目录是caches和preperence两个文件夹):用来存储程序的默认设置或者其他状态信息;

Library/Caches:存放缓存文件,iTunes不会备份此目录,应用退出时此目录文件不会被删除;

tmp:提供一个创建临时文件的地方;

20.封装的.a和framework的区别

一、什么是库?

库是共享程序代码的方式,一般分为静态库和动态库。

二、静态库与动态库的区别?

静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝。

动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存。

三、iOS里静态库形式?

.a和.framework

四、iOS里动态库形式?

.dylib和.framework

五、framework为什么既是静态库又是动态库?

系统的.framework是动态库,我们自己建立的.framework是静态库。

六、a与.framework有什么区别?

.a是一个纯二进制文件,.framework中除了有二进制文件之外还有资源文件。

.a文件不能直接使用,至少要有.h文件配合,.framework文件可以直接使用。

.a + .h + sourceFile = .framework。

建议用.framework.

七、静态库和动态库

方便共享代码,便于合理使用。

实现iOS程序的模块化。可以把固定的业务模块化成静态库。

和别人分享你的代码库,但不想让别人看到你代码的实现。

开发第三方sdk的需要。

八、制作静态库时的几点注意:

1 注意理解:无论是.a静态库还.framework静态库,我们需要的都是二进制文件+.h+其它资源文件的形式,不同的是,.a本身就是二进制文件,需要我们自己配上.h和其它文件才能使用,而.framework本身已经包含了.h和其它文件,可以直接使用。

2 图片资源的处理:两种静态库,一般都是把图片文件单独的放在一个.bundle文件中,一般.bundle的名字和.a或.framework的名字相 同。.bundle文件很好弄,新建一个文件夹,把它改名为.bundle就可以了,右键,显示包内容可以向其中添加图片资源。

3 category是我们实际开发项目中经常用到的,把category打成静态库是没有问题的,但是在用这个静态库的工程中,调用category中的方法时会有找不到该方法的运行时错误(selector not recognized),解决办法是:在使用静态库的工程中配置other linker flags的值为-ObjC。

4 如果一个静态库很复杂,需要暴露的.h比较多的话,就可以在静态库的内部创建一个.h文件(一般这个.h文件的名字和静态库的名字相同),然后把所有需要 暴露出来的.h文件都集中放在这个.h文件中,而那些原本需要暴露的.h都不需要再暴露了,只需要把.h暴露出来就可以了。

21.用过哪些框架

 Foundation.framework   CoreImage.framework  ImageIo.framework

 Foundation--提供OC的基础类(像NSObject)、基本数据类型等

 UIKit--创建和管理应用程序的用户界面

 QuartzCore--提供动画特效以及通过硬件进行渲染的能力(CALayer : NSObject)

CoreGraphics--提供2D绘制的基于C的API

SystemConfiguration--检测当前网络是否可用和硬件设备状态

AVFoundation--提供音频录制和回放的底层API,同时也负责管理音频硬件

CFNetwork--访问和配置网络,像HTTP、FTP和Bonjour Services

CoreFoundation--提供抽象的常用数据类型,如Unicode strings、XML、URL等

CoreLocation--使用GPS和WIFI获取位置信息

22.使用layer属性时减小系统开销

在做一个NavigationController push 子页面时,发现push和pop时很卡,研究了一大阵子后,发现在子页面里影响UI流畅的只有UIImageView的圆角设置;然后我就关闭了圆角,重 新运行果然流畅多了。但是产品的需求必须加圆角,没办法,去stackoverflow找方案,发现方法都大同小异,只不过是绘制上做一些优化。后来查看 layer的头文件,最后找到了一个牛B的属性shouldRasterize

    self.contentView.layer.shouldRasterize = YES;

当 shouldRasterize设成true时,layer被渲染成一个bitmap,并缓存起来,等下次使用时不会再重新去渲染了。实现圆角本身就是在做颜色混合(blending),如果每次页面出来时都blending,消耗太大,这时shouldRasterize = yes,下次就只是简单的从渲染引擎的cache里读取那张bitmap,节约系统资源。

额外收获:如果在滚动tableView时,每次都执行圆角设置,肯定会阻塞UI,设置这个将会使滑动更加流畅。

 

圆角的设置在iOS中随处可见,开发的时候也很方便,但是有的时候如果一个页面有大量的需要设置圆角的图片,容易产生性能问题, UIImageView ios9.0 之前设置圆角是会产生离屏渲染的, 9.0 之后不会产生离屏渲染

因此需要日常设置圆角的方法上加一些改动:

1.最简单的图片圆角设置:

self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(100,200, 100, 100)];
    [self.imageView setImage:[UIImage imageNamed:@"FlyElephant.jpg"]];
    self.imageView.layer.cornerRadius=50;
    self.imageView.layer.masksToBounds=YES;
    [self.view addSubview:self.imageView];

 

2.设置 Rasterize栅格化处理,会将图片放在缓存区,不会不断的进行图片渲染:

 

self.imageView=[[UIImageView alloc]initWithFrame:CGRectMake(100,200, 100, 100)];
    [self.imageView setImage:[UIImage imageNamed:@"dress3.jpg"]];
    self.imageView.layer.cornerRadius=50;
    self.imageView.layer.shouldRasterize = YES;
    self.imageView.clipsToBounds=YES;
    self.imageView.layer.rasterizationScale=[UIScreen mainScreen].scale;  //不设置会模糊,不相信可以自己尝试
    [self.view addSubview:self.imageView];

 

 23.苹果系统推送那些事

 

 24.UDP TCP 区别 和第三次握手过程

 

 25.为什么适配的时候,图片有@2x  @3x

使用initWithContentsOfFile可以优先选择3x图像,而不是2x图像。

NSString *path = [[NSBundle mainBundle] pathForResource:@"smallcat" ofType:@"png"];(黄色文件夹逻辑结构)

UIImage *image = [[UIImage alloc]initWithContentsOfFile:path];

在ipone5 s、iphone6和iphone6 plus都是优先加载@3x的图片,如果没有@3x的图片,就优先加载@2x的图片


这个方法

[UIImage imageNamed:@"smallcat"];

iphone5s和iphone6优先加载@2x的图片,iphone6 plus是加载@3x的图片。

 

在高分辨率显示屏下, imageNamed:, imageWithContentsOfFile:, 和initWithContentsOfFile: 方法自动查找具有@2x名称的图片(注意:如果@2x.png图片与.png图片必须放在项目同一包下,才能自动查找)。如果找到,则会加载该图片。如果没有提供给定图片的高分辨率版本,image对象仍会加载标准版的图片资源,并在绘画过程中将其缩放。如果有提供给定图片的高分辨率版本,但是没有标准版的图片,在标准版显示屏下不会加载高清的图片。

26.GCD和NSOperationQueue 的区别和优势

 http://blog.devtang.com/2012/02/22/use-gcd/       唐巧的博客,

27.web页和Native的交互

web页面js掉用oc的情况下:

于是在UIWebView的delegate函数中,我们只要发现是jsbridge://开头的地址,就不进行内容的加载,转而执行相应的调用逻辑。然后Webview的代理方法(- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;)就可以拦截这个请求,并且解析出相应的方法和参数。

oc掉用js 的方法:

Native调用javascript语言,是通过UIWebView组件的stringByEvaluatingJavaScriptFromString方法来实现的,该方法返回js脚本的执行结果。

// Swift
webview.stringByEvaluatingJavaScriptFromString("Math.random()")
// OC
[webView stringByEvaluatingJavaScriptFromString:@"Math.random();"];

28.如何销毁一个不显示的viewcontroller,delloc方法不走是怎么回事?

 

 

 

 

以上是关于工作小知识 总结的主要内容,如果未能解决你的问题,请参考以下文章

回归 | js实用代码片段的封装与总结(持续更新中...)

工作小知识 总结

17年项目工作知识点小总结------彭记(022)

VS中添加自定义代码片段——偷懒小技巧

python小知识片段

python小知识片段