1.注意的数据用建模的方式,直接用数组取出的对象是id类型,不能用点语法,可以分开写,或是用getter方法。
2.关于代理的小结
@required 必须实现的方法
@optional 可选的实现方法
1.遵守协议,预先定义好方法,不实现,具体的实现工作由代理负责
<控件的名字+DataSource> 定义的与数据源有关的方法
<控件的名字+Delegate> 定义的与事件有关的方法,通常用来监听控件的事件。
2.代理方法
1>方法名以控件名开头(没有类前缀)-> 方便程序员编写的时候,快速找到需要的协议方法;
2> 第一个参数是自己 -> 意味着在协议方法中,可以直接访问对象的属性,或者调用方法;
3>代理方法的返回值 -> 控制器(代理)向控件(委托)发送数据
3.UITableView的行高设置效率。
//UITableViewDelegate的协议方法,行高默认是44,代理设置行高的优先级高于属性rowHeight
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
//适用于行高不同的情况,但是效率不高
return (indexPath.row % 2) ? 60 : 44;
// 以下代码可以使用rowHeight属性替换!,若是每行高度相同,则用属性来修改高度值,效率高。
// return 60;
}
4.UITableView内存优化方法
用优化方法,假设页面上同时显示的是5个单元格,那么上下拉动时,会重用单元格,不会分配新的内存空间,总共需要5个内存空间;
普通方法,假设总共有100个单元格,每次都要分配新的内存空间,最多需要100个内存空间。
//优化方法,重复利用内存空间
//可重用标示符字符串
//static静态变量,可以保证系统为变量只分配一次内存空间
//静态变量,一旦被创建,就不会被释放,只在程序被销毁时才会被释放!
static NSString *ID = @"CELL";
//dequeueReusableCellWithIdentifier是实例方法,从缓存池中取出可重用的单元格
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];
if (cell == nil) {
//如果没有,实例化新的单元格
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:ID];
}
//用下句,每次都要分配新的内存空间
// UITableViewCell *cell =[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];
5.tableView的右侧索引
//右侧索引
-(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
//索引数组的下标对应的是分组的下标
// NSMutableArray *arrayM = [NSMutableArray array];
// for (CarGroup *group in self.carGroup) {
// [arrayM addObject:group.title];
// }
// return arrayM;
//KVC方法是cocoa的大招
//用来间接获取或是修改对象的属性的方法
//<span style="background-color: rgb(255, 255, 0);">用KVC时,如果指定对象不包含keyPath的“键名”,则会进入对象的内部查找</span>
//如果取值的对象是一个数组,同样返回的是一个数组
return [self.carGroup valueForKey:@"title"];
}
6.自定义代理
#import <UIKit/UIKit.h>
<span style="background-color: rgb(255, 255, 0);">@class HMAppInfo, HMAppView;//提前声明一下HMAppView</span>
// 1. 协议名以类名开始+Delegate
<span style="background-color: rgb(255, 255, 0);">@protocol HMAppViewDelegate <NSObject> </span>
<span style="background-color: rgb(255, 255, 0);">@optional //表明是可选的方法,对应的是@required,必须实现的方法</span>
// 2. 协议方法,以类名开始(没有类前缀),第一个参数是自己
// 只是定义方法名,不做具体实现
<span style="background-color: rgb(255, 255, 0);">- (void)appViewDidClickDownloadButton:(HMAppView *)appView;</span>
@end
@interface HMAppView : UIView
<span style="background-color: rgb(255, 255, 0);">
// 3. 定义代理属性,遵守了HMAppViewDelegate协议的任意一个对象,都可以成为代理
@property (nonatomic, weak) id<HMAppViewDelegate> delegate;</span>
/** 类方法,方便调用视图 */
+ (instancetype)appView;
/** 实例化视图,并使用appInfo设置视图的显示 */
+ (instancetype)appViewWithAppInfo:(HMAppInfo *)appInfo;
// 自定义视图中显示的数据来源是数据模型
// 使用模型设置自定义视图的显示
@property (nonatomic, strong) HMAppInfo *appInfo;
@end