匿名分类 Class()可以添加参数和方法,但是只能为参与编译的类添加,参与链接的类无法添加,另外可以在多个头文件中通过这种方式为自己的类增加属性和方法(.m中也可以,但是添加的无法被其他文件引用)
信号量锁如果在等待时间内没有获得锁,那么下面的代码执行完之后也就没有必要去释放锁,否则计数会异常
other linkflag 可选选项和说明查看$ man ld ,很多引入第三方运行不正常编译报错都是可以通过增加flag解决
图片压缩
+(NSData *)zipNSDataWithImage:(UIImage *)sourceImage{
// 不支持
if (sourceImage.CGImage == nil) {
return UIImageJPEGRepresentation(sourceImage, 0.7);
}
// 预估总体大小
CGImageRef image = sourceImage.CGImage;
size_t bits = CGImageGetBitsPerPixel(image) / CGImageGetBitsPerComponent(image);
size_t total = CGImageGetBytesPerRow(image) * CGImageGetHeight(image);
// 检查是否太大了
NSInteger maximum = 500 * 1024; // 500k
CGFloat quality = 0.05; // 预估压缩率
if ((total * quality) > maximum) {
// 计算缩放比例
CGFloat rate = CGImageGetWidth(image) / (CGFloat)CGImageGetHeight(image);
CGFloat h2 = (CGFloat)(maximum / quality) / bits / rate;
CGFloat height = sqrt(h2);
CGFloat width = height * rate;
// 缩放图片
UIGraphicsBeginImageContext(CGSizeMake(width, height));
[sourceImage drawInRect:CGRectMake(0, 0, width, height)];
sourceImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
}
// 压缩图片
return UIImageJPEGRepresentation(sourceImage, 0.7);
}
作者:时间已静止
链接:https://www.jianshu.com/p/0418f5051185
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" 终端输入这条命令执行安转brew
指令操作
https://jingyan.baidu.com/article/e73e26c0a8717424adb6a7c4.html 新建自己的工作流程(快捷操作设定)
http://blog.csdn.net/zhao_yin/article/details/18401989 unity和iOS交互消息如何实现
http://www.jianshu.com/p/49fffc543140 如何用unity导出项目并且在xcode中完成配置
Xcode真机调试新增未支持的iOS版本
/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport
将下载的iOS系统版本插件文件夹放在此文件夹下
http://blog.csdn.net/null_nil/article/details/52233096 富文本不同字体的各种对齐方式方法
居中:NSMutableAttributedString 添加NSBaselineOffsetAttributeName这个Attribute
value = 0.36 * (大字号 - 小字号)
1. 内存中的五大区域
内存分为 5 个区域,分别指的是 -----> 栈区 / 堆区 /BSS 段 / 数据段 / 代码段
栈:存储局部变量,当其作用域执行完毕之后,就会被系统立即收回
堆:存储 OC 对象,手动申请的字节空间,需要调用 free 来释放
BSS 段:未初始化的全局变量和静态变量,一旦初始化就会从 BSS 段中回收掉,转存到数据段中
数据段:存储已经初始化的全局变量和静态变量,以及常量数据,直到结束程序时才会被立即收回
代码段:代码,直到结束程序时才会被立即收回
2.OC 中堆区存储对象的特点
除了堆区,其他区域的中存储的数据,都是又系统自动释放的
堆区中的 OC 对象,是不会自动释放的,如果不主动释放,那么将在程序结束的时候才去释放
3. 引用计数器
首先简单来说一下,每一个 OC 对象都有一个属性,叫做 retainCount,翻译过来也就是引用计数器,类型为 unsigned long,占据 8 个字节,每一个对象负责维护对象所引用的记数值,当一个新的引用指向对象,那么这个对象的引用值增加 1,当我们新创建出一个对象的时候这个对象的引用计数器的值默认为 1,当这个对象被少一次引用的时候那么就先让这个对象的引用记数值减 1,当这个对象所引用的记数值为 0 的时候,代表这个对象没有被使用,这时系统会自动回收掉此对象,回收这个对象的同时自动调用这个对象的 dealloc 方法
控制规则:
为对象发送一条 retain 消息,那么对象的引用计数器的值就会 +1
为对象发送一条 release 消息,那么对象的引用计数器的值就会 -1
为对象发送一条 retainCount 消息,那么就可以得到这个对象的引用计数器的值
4. 内存管理的分类
MRC:Manual Reference Counting 手动引用计数器,需要我们手动管理对象引用计数器的值
ARC:Autimatic Reference Counting 自动引用计数器,系统自动的改变对象引用计数器的值(iOS5 之后),ARC 是基于 MRC 的
5. 内存管理基本原则
新创建一个对象,这个对象的引用计数器的值为 1,有对象的创建,就需要匹配一个 release
是谁来负责 retain 的,谁就要负责 release,使用的时候 retain,不是用的时候 release
retain 的次数要和 release 次数想匹配,有加有减,做到平衡
6. 野指针
在 C 中,声明一个指针变量,没有为这个指针变量初始化,那么这个指针变量的值也就是一个垃圾值,指针指向随机的一块空间,那么我们叫做野指针
在 OC 中,一个指针指向的对象被释放了,那么这个指针叫野指针
7. 对象的回收
对象所占用的字节空间,分配给别人使用,系统未分配这块空间被别人使用之前,这个对象的数据仍然处在内存中
8. 僵尸对象
已经被收回但是这个对象的数据仍然处在内存中,像这样的对象叫做僵尸对象
僵尸对象有可能可以访问也有可能不可以访问,当僵尸对象所占的内存空间还没有分配给别人使用的时候,这个数据的对象其实仍然存在,通过指针仍然可以找到这个对象,所以说这个时候僵尸对象还可以被访问,当这个僵尸对象已经分配给别人使用的时候,这个对象就不存在了,这个时候不可以被访问
注意:一旦一个对象成为僵尸对象之后,这个对象无论如何都不应该被使用,无论有没有分配给别人使用,都不能用!且不可以复活!
9. 避免内存泄漏
有对象的创建,就必须要匹配一个 release,retain 和 release 的次数要匹配,不要随便为一个指针赋值为 nil,除非这个指针是野指针,在方法中不要随意对传入的对象进行 retain
当我们通过野指针去访问僵尸对象的时候会报错,为了避免报错当一个指针成为野指针后,为这个指针赋值为 nil