ARC内存管理
栈用于存储方法的局部变量
堆用于存储对象
ARC Automatic Reference Counting 自动引用计数
弱应用(weak reference)用于避免循环引用导致的内存释放不了的问题
@property
属性的名称是成员变量的名称去掉下划线,申明了属性后会自动在编译期生成带下划线的成员变量和相应的setter、getter方法
@property的属性
读写属性
readonly(只读) 只生成getter
readwrite(读写) 生成setter和getter
内存属性
strong 强引用
weak 弱引用
copy 对象拷贝 多用于 NSString NSMutableString NSArray NSMutableArray
为了避免其他操作对该对象的影响
assign 基础类型变量
注意:如果覆写(override)了一个属性setter和getter方法,编译器就不会自动生成相应的成员变量,需要开发者自己声明
@synthesize age = _age;
@synthesize age; OR @synthesize age = age; 只生成setter、getter方法,不生成成员变量
Autorelease
主要用于生成对象并返回的类方法中
比如:
+ (BNRItem *)someItem
{
BNRItem *item = [[[BNRItem alloc] init] autorelease];
return item;
}
@autoreleasepool{} 当这个方法块运行结束,所有对象将会被引用计数-1
View
一个view是UIView的实例或者是它的子类
view可以绘制自己
view可以响应触摸等事件
view存在于一个view树,这个树的根节点是应用的window对象
为了避免循环引用,属性superview都是弱应用
CGRect中的参数的单位都是“点”而不是像素,这样就不用考虑适配不同分辨率的问题
在视网膜屏幕上,一个点代表四个像素(2x2),普通屏幕上一个点就表示一个像素
UIView的frame和bounds的区别
bounds是view的内部坐标系,frame代表本身在superview坐标系的信息
在头文件和实现文件(*.m)中声明属相的区别
在头文件中声明的属性和方法对外部是可见的,在实现文件中声明的对外部不可见
ViewController
一个ViewController的view只有在需要显示在屏幕上时才会创建,这个中懒加载的方式可以节约内存提高性能
ViewController有两种方法创建它的视图树:
1.在代码中覆写UIViewController的loadView方法
2.在Interface Builder中创建NIB文件
当一个ViewController创建后他的view属性是为nil的,这时就会调用loadView方法
- (BOOL)application:(UIApplication *)application
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 方法中调用UIView的setRootViewController方法设置一个rootViewController,并且加载其view添加到window中,并且自动设置该view的大小和window的大小一致
viewDidLoad只会在ViewController的生命周期中调用一次,viewWillAppear每次重新出现在屏幕都会回调
ViewController生命周期
http://blog.csdn.net/ryantang03/article/details/8264072
KVC (key-value coding)
- (id)valueForKey:(NSString *)k;
- (void)setValue:(id)v forKey:(NSString *)k;