长路漫漫,唯剑作伴--问题答案

一、使用atomic一定是线程安全的吗?

  1. 回答

    • 不是

    • 对于atomic的属性,系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。比如,线程 A 的 getter 方法运行到一半,线程 B 调用了 setter:那么线程 A 的 getter 还是能得到一个完好无损的对象。

    • 对于nonatomic的属性,当其中一个线程正在改写某属性值的时候,另外一个线程也许会突然闯入,把尚未修改好的属性值读取出来。发证这种情况时,线程读取到的属性值肯能不对。

    • 当使用atomic时,虽然对属性的读和写是原子性的,但是仍然可能出现线程错误:当线程A进行写操作,这时其他线程的读或者写操作会因为等该操作而等待。当A线程的写操作结束后,B线程进行写操作,然后当A线程需要读操作时,却获得了在B线程的值,这就破坏了线程安全,如果有线程C在A线程读操作之前release了该属性,那么还会导致程序崩溃。所以仅仅使用atomic并不会使得线程安全,我们还要为线程添加lock来确保线程的安全。

    • 其实无论是否是原子性的只是针对于getter和setter而言,比如用atomic去操作一个NSMutableArray ,如果一个线程循环读数据,一个线程循环写数据,肯定会产生内存问题,这个就跟getter和setter就木有关系了。

  2. atomic,synchronized,NSLock,pthread mutex,OSSpinLock的差别

  3. 大飒飒发顺丰

二、load 和 initialize

  1. load

    • 在load中使用其他类是不安全的,因为其它类不一定加载完毕;

    • load方法不遵循继承规则,也就是说,如果某个类没有实现load方法,那么不管这个类的所有超类是否实现了这个方法,这个类都不会调用load

    • 如果类和分类都实现了load方法,两个类都会执行load,类先执行,分类后执行;

    • 实现了load方法的这个类,不管在程序运行中是否用到,程序在启动时都会把每个类中的load方法调用一次(这个和initialize不同)。

  2. initialize

    • 它是“惰性调用”,也就是说当程序用到这个类的时候才调用,而load是不管这个类是否被使用,程序加载时都会调用;

    • 在调用initialize的时候,系统处于常态,所以在此方法内可以调用任何方法;

    • initialize方法与其他消息一样,如果某个类没有实现它,而其超类实现了它,那么就会运行超类的实现代码。

三、如何高性能的给UIImageView加个圆角?或者问如何绘制图片

  1. 使用layer的conerRadios属性或者使用CAShapLayer遮盖均会造成离屏渲染。使用Core Graphics进行绘制,会具有更高的性能

    #import "UIImage+DrawImage.h"
    
    @implementation UIImage (DrawImage)
    
    + (UIImage *)zy_drawImageWithImage:(UIImage *)image
                               andSize:(CGSize)size {
        // 开启图形上下文
        UIGraphicsBeginImageContext(size);
        // 绘制图片到图形上下文中
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        // 从图形上下文中获取图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return newImage;
    }
    + (UIImage *)zy_drawImageWithImage:(UIImage *)image
                               andSize:(CGSize)size
                             andString:(NSString *)string
                        andStringPoint:(CGPoint)point
                          andAttribute:(NSDictionary *)attributeDict{
        // 开启图形上下文
        UIGraphicsBeginImageContext(size);
        // 绘制图片到图形上下文中
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        // 绘制文字到图形上下文
        [string drawAtPoint:point withAttributes:attributeDict];
        // 从上下文中获取图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return newImage;
    }
    + (UIImage *)zy_drawImage:(UIImage *)image
                      andSize:(CGSize)size
                andWaterImage:(UIImage *)waterImage
                    andInRect:(CGRect)rect {
        // 开启图形上下文
        UIGraphicsBeginImageContext(size);
        // 绘制图片到图形上下文
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        // 绘制水印图片
        [waterImage drawInRect:rect];
        // 从图形上下文获取图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return newImage;
    }
    + (UIImage *)zy_drawRoundImage:(UIImage *)image andSize:(CGSize)size {
        // 开启图形上下文
        UIGraphicsBeginImageContextWithOptions(size, NO, 0);
        // 设置剪裁区域
        UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0, (size.height - size.width) / 2, size.width, size.width)];
        [path addClip];
        // 绘制图片到图形上下文
        [image drawInRect:CGRectMake(0, 0, size.width, size.height)];
        // 从图形上下文中获取图片
        UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
        // 关闭图形上下文
        UIGraphicsEndImageContext();
        return newImage;
    }
    @end

四、get和post

  1. 安全性

    • GET与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !

    • POST 比 GET更安全一些。

  2. 数据在URL中的可见性

    • GET请求数据在 URL 中对所有人都是可见的。

    • POST请求数据在URL中是不可见得。

  3. 对数据长度的限制

    • 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
    • POST请求无限制

五、

 

转载于:https://www.cnblogs.com/zhuyiios/p/6724159.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值