美文网首页我爱编程
整理一下面经(美团二三面)

整理一下面经(美团二三面)

作者: 咸鱼有只喵 | 来源:发表于2018-04-16 21:24 被阅读139次

    给button加圆角的方式

    1.cornerRadius。

    2.使用贝塞尔曲线画圆角

    贝塞尔和Core Graphics画圆角:用贝塞尔曲线画出一个圆形图,然后将button的image设置为该图;

    3.使用CAShapeLayer和贝塞尔设置圆角:alloc一个CAshapeLayer,用贝塞尔画出圆形path赋值给layer,将button的layer.mask属性设置为layer;

    CALayer和UIVIew

    1 :首先呢CAlayer 是直接继承自NSObjec的,而UIview、UIVC、UIkit类中的、UIAppliation都是继承自UIResponder,在其中定义了各种事件处理的接口;

    2:一个 Layer 的 frame 是由它的 anchorPoint,position,bounds,和 transform 共同决定的,而一个 View 的 frame 只是简单的返回 Layer的 frame,同样 View 的 center和 bounds 也是返回 Layer 的一些属性

    3:UIView是CALayer的Delegate,它偏向于管理显示内容,而layer偏向于绘制内容;

    4:修改非rootLayer会产生隐式动画;

    Button圆角的触控区域

    扩展触控区域要用到Runtime,因为Category不能添加属性,这时候就需要动态的为其添加扩展距离的属性,然后用Associative Object关联对象,动态的添加扩展距离属性;

    1.  static char topNameKey;  //设置属性。扩展的大小;
    
    2.  (void) setEnlargeEdgeWithTop:(CGFloat) top right:(CGFloat) right bottom:(CGFloat) bottom left:(CGFloat) left  //设置关联属性
    
    3.  {  
    
    4.  objc_setAssociatedObject(self, &topNameKey, [NSNumber numberWithFloat:top], OBJC_ASSOCIATION_COPY_NONATOMIC);  
    
    1.  ​
    
    2.  扩展大小;
    3.  (CGRect) enlargedRect  
    
    4.  {  
    
    5.  NSNumber* topEdge = objc_getAssociatedObject(self, &topNameKey);  
    
    6.  NSNumber* rightEdge = objc_getAssociatedObject(self, &rightNameKey);  
    
    7.  NSNumber* bottomEdge = objc_getAssociatedObject(self, &bottomNameKey);  
    
    8.  NSNumber* leftEdge = objc_getAssociatedObject(self, &leftNameKey);  
    
    9.  if (topEdge && rightEdge && bottomEdge && leftEdge)  
    
    10.  {  
    
    11.  return CGRectMake(self.bounds.origin.x - leftEdge.floatValue,  
    
    12.  self.bounds.origin.y - topEdge.floatValue,  
    
    13.  self.bounds.size.width + leftEdge.floatValue + rightEdge.floatValue,  
    
    14.  self.bounds.size.height + topEdge.floatValue + bottomEdge.floatValue);  
    
    15.  }  
    
    16.  else  
    
    17.  {  
    
    18.  return self.bounds;  
    
    19.  }  
    
    20.  }  
    
    重写HitTest
    
    1.  - (UIView*) hitTest:(CGPoint) point withEvent:(UIEvent*) event  
    
    2.  {  
    
    3.  CGRect rect = [self enlargedRect];  
    
    4.  if (CGRectEqualToRect(rect, self.bounds))  
    
    5.  {  
    
    6.  return [super hitTest:point withEvent:event];  
    
    7.  }  
    
    8.  return CGRectContainsPoint(rect, point) ? self : nil;  
    
    9.  } 
    
    

    hittest

    IOS响应链,点击事件和手势哪个先触发

    image.png

    如果hit-test view或first responder不处理此事件,则将事件传递给其nextResponder处理,若有UIViewController对象则传递给UIViewController,传递给其superView。

    如果view的viewController也不处理事件,则viewController将事件传递给其管理view的superView。

    视图层级结构的顶级为UIWindow对象,如果window仍不处理此事件,传递给UIApplication.

    若UIApplication对象不处理此事件,则事件被丢弃。

    巧妙使用Responder:

    根据一个view对象,没有直接的方法可以得到管理它的viewController,但我们使用responder chain可以间接的得到,代码如下:

    @implementation UIView (ParentController)

    -(UIViewController*)parentController{

    UIResponder *responder = [self nextResponder];
    
    while (responder) {
    
        if ([responder isKindOfClass:[UIViewController class]]) {
    
                return (UIViewController*)responder;
    
        }
    
        responder = [responder nextResponder];
    
    }
    
    return nil;
    

    }

    @end

    https://blog.csdn.net/chun799/article/details/8223612

    GCD,dispatch_once的作用(线程安全)

    https://www.jianshu.com/p/2d57c72016c6

    iOS死锁的触发条件

    双向阻塞会发生死锁;

    比如我用GCD创建一个Sync同步的主线程任务,这个任务是一个闭包,此时就会等待闭包执行完毕,而此时主线程又是阻塞状态,造成了双向的阻塞;

    循环引用

    https://www.jianshu.com/p/ddfd1b3c0298

    HTTP和HTTPS

    HTTPS和HTTP的区别主要如下:

    1、https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。

    2、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。

    3、http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

    4、http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    链接:https://www.jianshu.com/p/6db0c6dc97a9

    SSL证书,CA证书

    https://www.cnblogs.com/handsomeBoys/p/6556336.html

    Socket

    可选类型的实现

    (some、none)EMUM枚举

    TCP和UDP

    image.png

    Tcp/IP。慢启动

    https://blog.csdn.net/jtracydy/article/details/52366461

    进程通信方式

    消息传递(管道、FIFO、消息队列)
    

    同步(互斥量、条件变量、读写锁、文件和写记录锁、信号量)

    共享内存(匿名的和具名的)

    远程过程调用(Solaris门和Sun RPC)

    1.管道(pipe)

    管道是一种具有两个端点的通信通道,一个管道实际上就是只存在在内存中的文件,对这个文件操作需要两个已经打开文件进行,他们代表管道的两端,也叫两个句槟,管道是一种特殊的文件,不属于一种文件系统,而是一种独立的文件系统,有自己的数据结构,根据管道的使用范围划分为无名管道和命名管道。
    

    无名管道用于父进程和子进程之间,通常父进程创建管道,然后由通信的子进程继承父进程的读端点句柄和写端点句柄,或者父进程有读写句柄的子进程,这些子进程可以使用管道直接通信,不需要通过父进程。

    命名管道,命名管道是为了解决无名管道只能在父子进程间通信而设计的,命名管道是建立在实际的磁盘介质或文件系统(而不是只存在内存中),任何进程可以通过文件名或路径建立与该文件的联系,命名换到需要一种FIFO文件(有先进先出的原则),虽然FIFO文件的inode节点在磁盘上,但仅是一个节点而已,文件的数据还是存在于内存缓冲页面中,和普通管道相同。

    2.信号

    信号,用于接受某种事件发生,除了用于进程间通信之外,进程还可以发送信号给进程本身。除了系统内核和root之外,只有具备相同id的进程才可以信号进行通信。
    

    3.消息队列

    消息队列是消息的链表,包括Posix消息队列和system v消息队列(Posix常用于线程,system常用于进程),有权限的进程可以向消息队列中添加消息,有读权限的进程可以读走消息队列的消息。
    

    消息队列克服了信号承载信息量少,管道只能承载无格式字节流及缓冲区大小受限等缺陷。

    4.共享内存

    共享内存使多个进程可以访问同一块内存空间,是最快的IPC形式,是针对其他通信方式运行效率低而设计的,往往与其他进程结合使用,如与信号量结合,来达到进程间的同步与互斥。传递文件最好用共享内存的方式。 
    

    进程线程区别

    https://blog.csdn.net/yanxiaolx/article/details/51763372

    进程是cpu资源分配的最小单位,线程是cpu调度的最小单位。

    Swift重载运算符

    OC和C++实现类的方式

    OC和C++的区别

    一个应用问题,怎么设计完成一个网盘系统(图的遍历计算总大小、多线程下载)

    控制同时下载的文件的个数(控制并发数目)

    算法题:二维数组螺旋输出

    美团三面:

    你在上两面哪里表现的好,哪里不好?
    大学中你觉得最难的一门课是什么,怎么去克服的?
    团队中出现矛盾怎么解决
    怎么协调与团队成员的关系
    对你影响最大的一个项目
    你对美团的技术团队有了解么(。。之前不小心看到了美团技术团队的博客然后巴拉巴拉扯了一下)
    你对美团公司的了解呢
    你平时是怎么学习的
    CPU知道线程和进程么?
    CPU怎么调度进程的
    阻塞IO/非阻塞IO。。。
    用户态和内核态
    MVVM的特点和好处
    IOS进程锁机制
    进程通信的方式
    IOS代码规范
    IOS代码风格
    Swift什么优点
    动态语言和静态语言
    弱类型和强类型语言
    网络请求数据交换格式了解多少
    代码自动化的问题
    又一个2048游戏,写一下他的需求文档,你会怎么写
    你有什么想问的(我问了我们美团上海的主要是做什么的)

    相关文章

      网友评论

        本文标题:整理一下面经(美团二三面)

        本文链接:https://www.haomeiwen.com/subject/atkykftx.html