一、使用atomic一定是线程安全的吗?
-
回答
-
不是
-
对于
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就木有关系了。
-
-
atomic,synchronized,NSLock,pthread mutex,OSSpinLock的差别
- 大飒飒发顺丰
二、load 和 initialize
-
load
-
在load中使用其他类是不安全的,因为其它类不一定加载完毕;
-
load方法不遵循继承规则,也就是说,如果某个类没有实现load方法,那么不管这个类的所有超类是否实现了这个方法,这个类都不会调用load
-
如果类和分类都实现了load方法,两个类都会执行load,类先执行,分类后执行;
-
实现了load方法的这个类,不管在程序运行中是否用到,程序在启动时都会把每个类中的load方法调用一次(这个和initialize不同)。
-
-
initialize
-
它是“惰性调用”,也就是说当程序用到这个类的时候才调用,而load是不管这个类是否被使用,程序加载时都会调用;
-
在调用initialize的时候,系统处于常态,所以在此方法内可以调用任何方法;
-
initialize方法与其他消息一样,如果某个类没有实现它,而其超类实现了它,那么就会运行超类的实现代码。
-
三、如何高性能的给UIImageView加个圆角?或者问如何绘制图片
-
使用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
-
安全性
-
GET与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。在发送密码或其他敏感信息时绝不要使用 GET !
-
POST 比 GET更安全一些。
-
-
数据在URL中的可见性
-
GET请求数据在 URL 中对所有人都是可见的。
-
POST请求数据在URL中是不可见得。
-
-
对数据长度的限制
- 当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。
- POST请求无限制
五、