一.UIView圆角属性
@property(nonatomic) CGFloat cornerRadius
先来看看官方文档中的介绍:
The maximum corner radius is half the plane’s smaller dimension. For example, if a plane’s width and height properties are both 10.0, setting a corner radius of 5.0 gives the plane a circular shape, and increasing the corner radius beyond 5.0 has no effect. If a plane has width 10.0 and height 5.0, the maximum corner radius is 2.5, creating a rectangular shape with circular endcaps.
You can animate changes to this property’s value.
大体的意思就是说,cornerRadius的属性最大值是你的view的长和宽中较小的那个的一半,而最小值是0.
二.block使用场景
- 当多个方法中他们有很多代码是相同的,只有部分代码经常变动,我们可以把那个变动的部分用block参数传入
- 动画
- 多线程
- 集合遍历
- 网络请求回调
三.ios开发书单
iOS Progrmming The Big Nerd Ranch Guide
iOS by tutorial 有5,6,7 ,8Raywenderlich 出品
Programming iOS8: Dive Deep into Views, View Controllers, and Frameworks
四.iOS推送机制
上图就是iOS推送机制的大体流程,APNS就是苹果的推送服务器,下面那个server就是要推送的服务器,在推送之前,app会先通过下述方法获取一个叫deviceToken的认证信息:
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
该认证信息会在下述回调方法中返回:
(void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken
{
NSLog(@"My token is: %@", deviceToken);
}
我们获取到这个deviceToken后将其发送给你的Server,因为server跟APNS是通过SSL连接的,需要认证信息,而这个deviceToken就是;再以后Server就可以通过这个认证信息向APNS发送推送消息,APNS会转发给app
五.分类
分类作用:扩展已有类的功能,
(1)相当于在已有类中添加方法,跟原类中的方法有一样的性质
(2)在方法内部可以访问原有类的成员变量(该变量必须定义在.h文件中)
(3)不能在分类中为原有类增加实例变量,通过@property只能生成getter和setter方法的声明,不能生成方法的实现,更不会生成成员变量
(4)可以扩充系统自带的类的功能
(5)多个分类具有同名的方法,按照编译的最后那个的方法
六.import后面的<>与”“的区别
“”表示从当前项目路径开始寻找文件,如果找不到,则到系统(项目)中配置的头文件路径去找;
<>表示直接到系统(项目)中配置的头文件路径去找。
使用@class可以避免循环包含问题。
七.面向对象的设计思想
- 耦合度:当修改一个对象的时候,对另外一个对象的影响程度
- 低耦合:当修改一个对象,对其它对象影响比较小
- 高内聚:一个对象仅仅做自己相关的事情
- 面向对象设计原则:单一职责原则
八.@property参数
- assign表示直接赋值,不要生成内存管理的代码,一般用在基本数据类型
- copy, 复制对象 , 一般用于NSString类型
- nonatomic: 非原子,不会生成线程安全的代码,速度快,IOS通常都是这种,性能高
- atomic:原子(默认),会生成线程安全的代码,性能低
- readwrite:可读可写,生成getter和setter方法的声明与实现
readonly:只读 只生成getter方法
strong : 用于OC对象, 相当于MRC中的retain
- weak : 用于OC对象, 相当于MRC中的assign
- assign : 用于基本数据类型, 跟MRC中的assign一样
- copy : 一般用于NSString, 跟MRC中的copy一样
九.NSUserDefaults
NSUserDefaults支持的数据格式有:NSData, NSString, NSNumber, NSDate, NSArray, or NSDictionary
NSUserDefaults的缓存避免了在每次读取数据时候都打开用户默认数据库的操作。可以通过调用synchronize方法来使内存中的缓存与用户默认系统进行同步
对于相同的key进行赋值会覆盖上一次的key的值.
对于自定义的对象,如果要使用NSUserDefaults,那可以先通过归档把这个对象转为data类型的,然后直接把data写入NSUserDefaults中就可以了,如果是一群自定义的对象,那最好采用数组,然后把数组存进去,但是苹果官方是不建议这么做的,这么做会存在潜在的危险,因为如果你的软件的一个对象是个旧的版本写到本地的,你的新的版本必须有这个类才能进行解析,最好的方法,只是通过偏好设置存储一些strings 或者 values ,然后用这些simple值来创建你的对象。
Storing objects persistently means that your app has to decode that object at some point. In the case of preferences, a stored object means decoding the object every time you access the preference. It also means that a newer version of your app has to ensure that it is able to decode objects created and written to disk using an earlier version of your app, which is potentially error prone.
A better approach for preferences is to store simple strings and values and use them to create the objects your app needs. Storing simple values means that your app can always access the value. The only thing that changes from release to release is the interpretation of the simple value and the objects your app creates in response.
十.dealloc的意义
在这里可以释放一些不在 ARC 控制下的资源。 例如 Core Foundation 对象中调用 CFRelease(), 对那些通过 malloc() 分配的内存调用 free(), 注销通知,停止 Timer, 等等。
当一个对象的引用计数为0的时候,会自动调用dealloc方法。
十一.在类的源文件(.m)中,@interface部分的作用
此@interface部分为类扩展(extension)。
其被设计出来就是为了解决两个问题的,其一,定义类私有方法的地方。其二,实现public readonly,private readwrite的property(意思是在h头文件中定义一个属性对外是readonly的,但在类的内部希望是可读写的,所以可以在m源文件中的@interface部分重新定义此属性为readwrite,此时此属性对外是只读的,对内是读写的)。
十二.YYKit性能优化的tip
缓存
Model JSON 转换过程中需要很多类的元数据,如果数据足够小,则全部缓存到内存中。查表
当遇到多项选择的条件时,要尽量使用查表法实现,比如 switch/case,C Array,如果查表条件是对象,则可以用 NSDictionary 来实现。避免 KVC
Key-Value Coding 使用起来非常方便,但性能上要差于直接调用 Getter/Setter,所以如果能避免 KVC 而用 Getter/Setter 代替,性能会有较大提升。避免 Getter/Setter 调用
如果能直接访问 ivar,则尽量使用 ivar 而不要使用 Getter/Setter 这样也能节省一部分开销。避免多余的内存管理方法
在 ARC 条件下,默认声明的对象是 __strong 类型的,赋值时有可能会产生 retain/release 调用,如果一个变量在其生命周期内不会被释放,则使用 __unsafe_unretained 会节省很大的开销。访问具有 __weak 属性的变量时,实际上会调用 objc_loadWeak() 和 objc_storeWeak() 来完成,这也会带来很大的开销,所以要避免使用 __weak 属性。
创建和使用对象时,要尽量避免对象进入 autoreleasepool,以避免额外的资源开销。
遍历容器类时,选择更高效的方法
相对于 Foundation 的方法来说,CoreFoundation 的方法有更高的性能,用 CFArrayApplyFunction() 和 CFDictionaryApplyFunction() 方法来遍历容器类能带来不少性能提升,但代码写起来会非常麻烦。尽量用纯 C 函数、内联函数
使用纯 C 函数可以避免 ObjC 的消息发送带来的开销。如果 C 函数比较小,使用 inline 可以避免一部分压栈弹栈等函数调用的开销。减少遍历的循环次数
在 JSON 和 Model 转换前,Model 的属性个数和 JSON 的属性个数都是已知的,这时选择数量较少的那一方进行遍历,会节省很多时间。
十三.NSSet和NSArray
NSSet , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray(是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;
比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了;
NSSet是采用不连续存储的,并且采用hash算法的,效率NSArray高的无序的集合。
十四.UIImageView的内容模式
十五.UITextView
内容不足的情况下,拖拽:
// 设置textView在内容不满的情况下可以拖拽
_textView.alwaysBounceVertical = YES;
其实只要是继承自UIScrollView的都可以这么设置。
十六.transform
一般需要还原的动画采用transform,下面是在控件随键盘弹出与弹回时的动画的代码:
if (frame.origin.y == self.view.height) {// 没有弹出
_toolBar.transform = CGAffineTransformIdentity;
}else{// 弹出键盘
// 工具条往上移动键盘的高度
_toolBar.transform = CGAffineTransformMakeTranslation(0, 0 - frame.size.height);
}
十七.项目文件夹的分组
在项目中,文件夹一定要在show in finder里面实体的分组,这样以后项目的移动或者抽出具体的文件很方便,今天把一个项目的主要文件改错了,然后回不去了,只能重新建一个新的工程,然后挨个往里考,这尼玛才发现分组的好处啊.