==常见陷阱==
* delegate属性一般应该是assign而不是retain,否则会造成对象的循环引用,都不会被释放
* [UIButton buttonWithTitle:...]一类函数返回的对象没有alloc,不能直接release,会造成重复释放。很多莫名其妙的崩溃是这个原因引起的
* 地图控件在3.x系统上有bug,如果在动画没有结束时就release掉mapview控件,在动画结束回调时会崩溃。解决办法是在dealloc里设
mapview.delegate=nil;
[mapview.layer removeAllAnimations];
mapview showUserLocations=NO;
* 如果页面里有多线程,例如网络请求,在退出页面时应该终止线程,并把delegate设成nil
* 内存低时系统会自动调用当前没有显示的view controller的viewDidUnload函数,在需要显示的时候会自动调用loadView和viewDidLoad来重建页面,所以在这里应该释放掉所有在loadView和viewDidLoad中被创建的对象。否则会重复创建,导致内存泄露
* 使用属性时要注意,self.object = [[MyObject alloc] init]; 这样调用会有内存泄露,因为属性可能会自动retain,所以需要写成
self.object=[[[MyObject alloc] init] autorelease];
或者写成(但是这种写法比较容易让人困惑):
self.object = [[MyObject alloc] init]; // retainCount = 2
[self.object release] // retainCount = 1
或者写成:
MyObject obj = [[MyObject alloc] init];
self.object = obj;
[obj release];
* 调试内存重复释放可以设置executable的属性,添加一个运行环境变量NSZombieEnabled=YES; 这样,在引用已被释放的对象时会弹出异常。但是注意发布的时候要把这个选项去掉。