我爱编程

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

2018-04-16  本文已影响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游戏,写一下他的需求文档,你会怎么写
你有什么想问的(我问了我们美团上海的主要是做什么的)

上一篇下一篇

猜你喜欢

热点阅读