UIViewController
UIViewController用来管理UIView,负责创建、显示、销毁、监听UIView内部事件,处理UIView与用户的交互。UIViewController内部有个UIView属性负责管理UIView
@property(nonatomic,retain) UIView *view;
-(void)ViewDidLoad(){
[super viewDidLoad];
}//视图加载完成调用,视图控制器初始化工作
延迟加载、懒加载
在需要时才加载到内存中,运行时判断参数类型,效率上低,内存消耗小
InterfaceBuilder
IBAction & IBOutlet
IBAction:用来和操作建立联系,本身是一个void,不过可建立连线
.h中-(IBAction)click;(左边出现连线)
.m中-(void)click{};
IBOutlet:用来和界面上的元素建立关系,用来获得或修改界面属性
@property(nonatomic,week)IBOutlet UITextView *textView;(左边出现连线)
ps:从xcode5开始,建议将不对外开放的属性和方法写在.m文件中(.m中的()为私有扩展)
项目新建
bundle identifier:产品的唯一标识符,在模拟器上只能有唯一的标志符,AppStore上也唯一,bundle id不支持中文,因此上架前要修改
company identifier:公司反向域名
控件监听
oc中绝大多数控件的监听方法第一个参数是控件本身
[btn addTarget:self action:@selector(click:) forControlEvents:UIControlEventsTouchUpInside];//self为UIViewController -(void)click:(id)sender{//第一个参数为控件本身即btn }
UIView控件属性
@property(nonatomic) GCRect frame;
控件所在矩形框在父控件中的位置和大小,以父控件左上角为原点
@property(nonatomic) GCRect bounds;
控件所在矩形框的位置和大小,以自己左上角为原点,因此x,y为0
@property(nonatomic) GCPoint center;
控件的中点位置,以父控件左上角为原点
@property(nonatomic) GCAffineTransform transform;
控件仿射形变,设置旋转角度、比例缩放、平移,GCAffineTransformMakeTransaction是基于对象初始位置做的形变,因此需要定义delta属性来记录变化量,GCAffineTransformTranslate是基于transform变量做的形变。
ps:在oc中,不允许直接修改”对象“的“结构体属性”的成员,但允许修改对象的“结构体属性”。因此首先要创建临时结构体,取出对象的结构体属性,然后修改结构体成员,最后设置回去对象的结构体属性
断点调试
左侧导航为程序调用的堆栈,调试时要同时注意左边的内存消耗,动画做完的数组要及时清理
strong/weak
1、懒加载的getter用strong
2、界面的控件用weak,因为addSubView已经让View强引用了
3、属性对象用strong
4、字符串NSString用copy
5、非对象用assign
运行循环
addTarget会把用户点击按钮的事件监听注册到运行循环中。
instancetype代替id
instancetype可以使编译器检查实例化对象的准确类型返回,但只能用于返回类型,不能当参数使用
- (instancetype)initWithPerson:(Person *)person;
init方法应对应个工厂方法
+ (instancetype)appInfoWithPerson:(Person *)person;
命名
1、类方法名以类名称开头
2、Mutable类型的变量如personM,后面加M
description
如果要打印对象重写description方法,类似于java的toString
KVC/KVO
key value coding键值编码
key value observe键值观察