iOS

iOS开发 基础一

2020-12-20  本文已影响0人  喜剧收尾_XWX

1.UIView和CALayer之间的关系

2.请输出C语言执行结果

#include<stdio.h>
int main(){
    int a[5] = {1,2,3,4,5};
    int *ptr = (int *)(&a + 1);
    printf("%d,%d,%d \n",*(a+1),*(ptr-1),*(ptr));
}

文章参考:https://www.cnblogs.com/yr-linux/p/5079897.html

3.请指出下面这段代码问题

 for (int i = 0; i < 10000; i++ ) {
        NSString *str = @"ABC";
        str = [str lowercaseString];
        str = [str stringByAppendingString:@"xyz"];
        NSLog(@"%@",str);
    }
for ( int i = 0 ; i < 10000 ; ++ i ) {
   @ autoreleasepool {
     NSString *str = @"Abc" ;
     str = [ str lowercaseString ] ;
     str = [ str stringByAppendingString : @"xyz" ] ;
      
     NSLog ( @"%@" , str ) ;
   }
}

4.APP的启动优化

优化的时候会将优化以main()函数为界分为2个部分,即main之前的pre-main阶段 和 main()之后。

pre-main阶段这个阶段是由dyld(动态连接器)来操作的,设置DYLD_PRINT_STATISTICS进行检测这个阶段耗时
main()函数之后的优化就因项目不同而异了,大致有这么几个核心:

文章参考 https://www.jianshu.com/p/5b41cb0c70ba

5.多个线程访问同一个对象、同一个变量、同一个文件如何保证线程安全

(1)添加互斥锁synchronized

@synchronized(锁对象) { // 需要锁定的代码  }

(2)在GCD中使用semaphore进行加锁

/**
 * 售卖火车票(线程安全)
 */
- (void)saleTicketSafe {
    while (1) {
        // 相当于加锁
        dispatch_semaphore_wait(semaphoreLock, DISPATCH_TIME_FOREVER);
        
        if (self.ticketSurplusCount > 0) {  // 如果还有票,继续售卖
            self.ticketSurplusCount--;
            NSLog(@"%@", [NSString stringWithFormat:@"剩余票数:%d 窗口:%@", self.ticketSurplusCount, [NSThread currentThread]]);
            [NSThread sleepForTimeInterval:0.2];
        } else { // 如果已卖完,关闭售票窗口
            NSLog(@"所有火车票均已售完");
            
            // 相当于解锁
            dispatch_semaphore_signal(semaphoreLock);
            break;
        }
        
        // 相当于解锁
        dispatch_semaphore_signal(semaphoreLock);
    }
}

文章参考https://www.jianshu.com/p/2d57c72016c6
https://www.cnblogs.com/wendingding/p/3805841.html

6.什么是线程死锁,什么情况下会造成线程死锁

(1)GCD主队类中同步添加任务

- (void)syncMain{
    
    dispatch_queue_t queue = dispatch_get_main_queue();
    
    NSLog(@"task1-%@",[NSThread currentThread]);
    
    dispatch_sync(queue, ^{
        NSLog(@"task2-%@",[NSThread currentThread]);
    });
    
    NSLog(@"task3-%@",[NSThread currentThread]);
}

原因:task1是在主线程中执行,而主线程是串行队列,定义的queue队列也是主队列, dispatch_sync是同步执行的标志,意思是必须等待block返回,才能执行task3,而当前主队列中正在被task1执行,必须等待完成task3完成后才能释放,这就造成了task3等待block完成返回,block等待task3完成释放主队列而相互等待的循环中死锁。

(2)串行队列异步&同步

- (void)gcdTest{
    
    dispatch_queue_t queue = dispatch_queue_create("com.demo.serialQueue", DISPATCH_QUEUE_SERIAL);
    
    NSLog(@"task1-%@",[NSThread currentThread]);
    
    dispatch_async(queue, ^{
    
        NSLog(@"task2-%@",[NSThread currentThread]);
        
        dispatch_sync(queue, ^{
            NSLog(@"task3-%@",[NSThread currentThread]);
        });
        
        NSLog(@"task4-%@",[NSThread currentThread]);
    });
    
    NSLog(@"task5-%@",[NSThread currentThread]);
}

输出结果为test1 - test5 - tesk2
原因:task2、task4与task3在同一队列中执行,dispatch_sync确定了task4需要等待task3完成后返回才能执行,而task2任务执行的时候已经占用了当前队列,需要等到task4完成后才能释放,这就造成了task3等待task4完成,task4等待task3返回的相互等待,这也是队列阻塞造成的死锁。

参考文章:https://www.cnblogs.com/beckwang0912/p/7146833.html

7.TCP的一些知识点

https://blog.csdn.net/qq_38950316/article/details/81087809

8.HTTPS和HTTP的区别

* https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
  * http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
  * http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  * http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

9.GCD信号量-dispatch_semaphore_t的作用

https://www.jianshu.com/p/24ffa819379c

10.关于AFNet的封装与思考

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

上一篇 下一篇

猜你喜欢

热点阅读