常遇到的陷阱

==常见陷阱==

* delegate属性一般应该是assign而不是retain,否则会造成对象的循环引用,都不会被释放


* [UIButton buttonWithTitle:...]一类函数返回的对象没有alloc,不能直接release,会造成重复释放。很多莫名其妙的崩溃是这个原因引起的


* 地图控件在3.x系统上有bug,如果在动画没有结束时就releasemapview控件,在动画结束回调时会崩溃。解决办法是在dealloc里设

  mapview.delegate=nil;

  [mapview.layer removeAllAnimations];

  mapview showUserLocations=NO;

  

* 如果页面里有多线程,例如网络请求,在退出页面时应该终止线程,并把delegate设成nil


* 内存低时系统会自动调用当前没有显示的view controllerviewDidUnload函数,在需要显示的时候会自动调用loadViewviewDidLoad来重建页面,所以在这里应该释放掉所有在loadViewviewDidLoad中被创建的对象。否则会重复创建,导致内存泄露


* 使用属性时要注意,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; 这样,在引用已被释放的对象时会弹出异常。但是注意发布的时候要把这个选项去掉。

你可能感兴趣的:(常遇到的陷阱)