美文网首页
iOS学习笔记(8-23)

iOS学习笔记(8-23)

作者: 檐下风铃听雨声 | 来源:发表于2020-08-11 20:48 被阅读0次

    1.异步改同步,要求Aaa,Bbb,Ccc等顺序打印,要求多种方法

    Aaa;
    AsyncNetRequest^(id response){
       // use response
       Bbb;
    }
    ccc;
    ddd;
    fff;
    ...等
    

    让异步改成同步,其实主要的思想就是用阻塞线程的方式。主要可以用下面的方式。
    1.dispatch_semaphore_t信号量来控制请求顺序 dispatch_semaphore_signal()信号加1 dispatch_semaphore_wait()信号减1。

    [super viewDidLoad];
     
    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
    
     [self methodC:^{
         dispatch_semaphore_signal(semaphore);
     }];
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
     [self methodB:^{
         dispatch_semaphore_signal(semaphore);
     }];
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
     [self methodA:^{
         dispatch_semaphore_signal(semaphore);
     }];
     [self methodD:^{
         dispatch_semaphore_signal(semaphore);
     }];
     
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
     dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
    
     [self method];
    
    1. 用while循环阻塞线程 达到异步改同步的效果
    - (void)viewDidLoad {
        [super viewDidLoad];
     
        NSLog(@"%@",[self nameStr]);
        NSLog(@"next");
    }
    - (NSString *)nameStr{
        
        NSString __block * nameStr = @"小红";
        
        __block BOOL _sleep = YES;
        
        [self method:^(NSString *name) {
            nameStr = name;
            NSLog(@"1");
            _sleep = NO;
            NSLog(@"3");
        }];
        while (_sleep) {
           //while循环等待阻塞线程
            
        }
        NSLog(@"2");
        
        return nameStr;
    }
    

    3.利用dispatch_group_t 调度组 异步改同步 代码如下

    - (NSString *)nameStr{
    
       __block  NSString  * nameStr = @"小红";
    
        dispatch_group_t group = dispatch_group_create();
        dispatch_group_enter(group);
    
        [self method:^(NSString *name) {
            nameStr = name;
            dispatch_group_leave(group);
        }];
        
        dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
        return nameStr;
    }
    

    2.写出以下代码的打印顺序

    int main()
    {
        print Aaa;
        dispatch_after_delay(1秒, ^{
           // use response
           print Bbb;
        }
        print ccc;
        return 0;
    }
    

    会打印 Aaa和ccc,不会打印Bbb。原因就是这个不会开启NSRunLoop,程序按照顺序执行,所以在这个方法里,使用NSTimer也不会执行。


    3.NSDictionary、NSArray我们比较常用,那么它们分别的实现逻辑是怎么样的?C++的STL是什么?

    STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。


    4.有一个UITabelView,有一千个网络图片需要用tableview来做一个列表的加载,cell有一个imageview用sdwebimage去显示图片。它首先会加载前边几个网络图片,如果滑动到底部,又会优先加载底部的网络图片,滑到中间又会优先加载中间的网络图片,它总是能优先加载当前看到区域的这些cell的图片,这是一个什么样的原理?


    5.YYCache的原理说一下?


    6.UIView和CALayer的关系是什么?CALayer有一个属性叫content,它是一个什么类型的?一般画一个渐变图片用什么layer?layer的mask是什么类型的?

    CALayer有如下子类:


    CALayer的子类一览

    UIViewCALayer的关系:UIView负责处理用户交互,负责绘制内容的则是它持有的那个CALayer,我们访问和设置UIView的这些负责显示的属性实际上访问和设置的都是这个CALayer对应的属性,UIView只是将这些操作封装起来了而已。contents是一个类型为id的属性,在iOS开发中,可以利用这个属性给CALayer设置backing image
    根据上图我们可以知道,设置渐变图片的时候,我们可以使用CAGradientLayer这个子类。
    在代码的注释中:

    /* A layer whose alpha channel is used as a mask to select between the
     * layer's background and the result of compositing the layer's
     * contents with its filtered background. Defaults to nil. When used as
     * a mask the layer's `compositingFilter' and `backgroundFilters'
     * properties are ignored. When setting the mask to a new layer, the
     * new layer must have a nil superlayer, otherwise the behavior is
     * undefined. Nested masks (mask layers with their own masks) are
     * unsupported. */
    
      将其alpha通道用作蒙版的图层,以在图层的背景和将图层内容与其过滤背景进行合成的结果
      之间进行选择。 默认为nil。 当用作蒙板时,图层的“compositingFilter”和
      “backgroundFilters”属性将被忽略。 将遮罩设置为新图层时,新图层必须有一个nil的图层,
      否则行为未定义。 不支持嵌套蒙版(带有自己蒙版的蒙版图层)。
    
    @property(nullable, strong) CALayer *mask;
    

    也可以这么理解:

    • 是一个可选的layer,它的alpha通道用于遮罩图层的内容。图层的Alpha通道决定了有多少的图层的内容和背景的显示通过。 完全或部分不透明的像素允许底层内容显示,但完全透明的像素屏蔽该内容。
    • 这个属性的默认值是nil。 配置mask时,请记得设置遮罩层的大小和位置,以确保遮罩层与它遮罩的层正确对齐。
    • 您分配给此属性的图层不能有父图层。否则行为是不确定的。
    • 遮罩层必须至少有两个图层,上面的一个图层为“遮罩层”,下面的称“被遮罩层”;这两个图层中只有相重叠的地方才会被显示。也就是说在遮罩层中有对象的地方就是“透明”的,可以看到被遮罩层中的对象,而没有对象的地方就是不透明的,被遮罩层中相应位置的对象是看不见的。
        CAGradientLayer *gradientLayer = [CAGradientLayer layer];
        gradientLayer.frame = CGRectMake(100, 300, 200, 25);
        [gradientLayer setStartPoint:CGPointMake(0.0, 0.0)];
        [gradientLayer setEndPoint:CGPointMake(0.0, 1.0)];
        gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor 
       yellowColor].CGColor,(id)[UIColor blueColor].CGColor];
        
        UILabel *label = [[UILabel alloc] initWithFrame:gradientLayer.bounds];
        label.text = @"红黄蓝渐变~~";
        label.font = [UIFont boldSystemFontOfSize:25];
        label.backgroundColor = [UIColor clearColor];
        [self.view addSubview:label];
        
        [self.view.layer addSublayer:gradientLayer];
        gradientLayer.mask = label.layer;
    
    渐变颜色

    7.NSNumber是一种什么设计模式

    NSNumber内部是通过Tagged Pointer存储的。

    • Tagged Pointer专门用来存储小的对象,列入NSNumberNSDate.
    • Tagged Pointer指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已!所以,它的内存并不存储在堆中,也不需要malloc和free。
      iOS SDK中使用抽象工厂方法的例子是NSNumber

    8.请实现求根公式

    int main()
    {
       my_sqrt(2);
       return 0;
    }
    
    float my_sqrt(float val)
    {
    }
    //输入 2
    //输出 1.414
    
    • 二分法
      这种是最简单的,就是定义一个最小值0和最大值number,把一个数取一个中间值(0+number)/2,然后平方,如果平方大于该数值,就把中间值赋给最大值,否者就把中间值赋给最小值,一直循环,直到取到想要的精度为止。
    double sqrt1(double x){
        double EPSINON = 0.00001;
        double low = 0.0;
        double high = x;
        double mid = (low + high) / 2;
        while ((high - low) > EPSINON){
            if (mid*mid > x){
                high = mid;
            }
            else{
                low = mid;
            }
            mid = (high + low) / 2;
        }
        return mid;
    }
    

    相关文章

      网友评论

          本文标题:iOS学习笔记(8-23)

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