Natural

           

          UITableView滾動時crash

          照著網(wǎng)上的教程,吭哧吭哧寫好了一個tableView,Run起來,界面出現(xiàn)了。還來不及高興一下,一滾動,坑爹啊,直接crash掉了,退出。

          打開調(diào)試模式,再重現(xiàn)一次,Debugger Console顯示的結(jié)果是“Program received signal: "EXC_BAD_ACCESS"”.
          這個結(jié)果表示代碼中有數(shù)組越界或者哪里內(nèi)存泄漏了。(網(wǎng)上教程不靠譜啊,完全照著教程敲代碼竟然都錯了)

          還好總共沒幾個方法,多加幾個斷點調(diào)試一下。
          問題出來了:當(dāng)向下滾動,調(diào)用cellForRowAtIndexPath消息時,執(zhí)行到第25行代碼tableData已經(jīng)被回收了。

          問題分析:
          數(shù)組初始化放在viewDidLoad消息中,照著教程敲使用arrayWithObjects來創(chuàng)建。從語法上講,此方法是autorelease的,不需要我們手動去release。
          然而問題也出在這,當(dāng)向下滾動時,不知為何在viewDidLoad初始化的數(shù)組都已經(jīng)被回收了。

          修正方案:
          把viewDidLoad消息中數(shù)組創(chuàng)建方法都改為[[NSArray alloc] initWithObject: ……];方式創(chuàng)建,再在dealloc中釋放掉就OK了。

          推斷總結(jié):
          此代碼的界面是用IB拉出來的,對于新人來說我們并不清楚它的view的創(chuàng)建細(xì)節(jié)。從執(zhí)行效果來看,它在創(chuàng)建view時嵌套了個NSAutoreleasePool,向下滾動時已經(jīng)把pool給release掉了,所以出現(xiàn)crash。

          得到教訓(xùn)就是:使用IB創(chuàng)建界面時,那些自定義的對象盡量使用alloc/retain/copy方式創(chuàng)建,自己release。把內(nèi)存管理寄托在自動釋放池中是不靠譜的,除非這個池是你自己創(chuàng)建并釋放的。


          源代碼如下
           1 
           2 - (void)viewDidLoad {
           3     [super viewDidLoad];    
           4     tableData = [NSArray  arrayWithObjects:@"香辣醬香骨",@"肉末燒豆腐",@"芙蓉蝦",@"紅燒帶魚",
           5                  @"粉蒸排骨",@"自來紅月餅",@"蛋黃蓮蓉月餅",@"南瓜奶酪蛋糕",
           6                  @"南瓜沙拉",@"五香毛豆",@"奶油冰淇淋",@"焦糖南瓜冰淇淋",nil];
           7     thumbnails =[NSArray arrayWithObjects:@"a.jpg",@"b.jpg",@"c.jpg",@"d.jpg",@"e.jpg",@"f.jpg",
           8                   @"g.jpg",@"h.jpg",@"i.jpg",@"j.jpg",@"k.jpg",@"l.jpg",nil];
           9     prepTime = [NSArray arrayWithObjects:@"10 min",@"5 min",@"5 min",@"10 min",@"8 min",@"30 min",
          10                   @"30 min",@"45 min",@"20 min",@"5 min",@"50 min",@"40 min",nil];
          11 }
          12 
          13 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
          14     return [tableData count];
          15 }
          16 
          17 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
          18     static NSString *simpleTableIdentifier = @"SimpleTableItem";
          19     SimpleTableCell *cell = (SimpleTableCell *)[tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];
          20     if(cell == nil){
          21         NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"SimpleTableCell" owner:self options:nil];
          22         cell = [nib objectAtIndex:0];
          23     }
          24     NSUInteger row = [indexPath row];
          25     cell.nameLabel.text = [tableData     objectAtIndex:row];
          26     cell.thumbnailImageView.image = [UIImage imageNamed:[thumbnails objectAtIndex:row]];
          27     cell.prepTimeLabel.text = [prepTime objectAtIndex:row];
          28     return cell;
          29 }
          30 
          31 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
          32     return 78;
          33 }
          34 
          35 - (void)dealloc {
          36     [super dealloc];
          37 }

          posted on 2012-09-07 11:33 此號已被刪 閱讀(1008) 評論(0)  編輯  收藏 所屬分類: Objective-C


          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計

          常用鏈接

          留言簿(8)

          隨筆分類(83)

          隨筆檔案(78)

          文章檔案(2)

          相冊

          收藏夾(7)

          最新隨筆

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 卢湾区| 浦城县| 鹰潭市| 恩平市| 乐东| 全州县| 石林| 嵩明县| 河池市| 延吉市| 芮城县| 甘孜| 田林县| 富阳市| 女性| 鹤山市| 措勤县| 宝应县| 高平市| 淮滨县| 高雄市| 黄石市| 敦煌市| 景洪市| 河间市| 大埔县| 河北省| 利辛县| 合山市| 嘉峪关市| 新绛县| 伊川县| 东安县| 漾濞| 乌苏市| 凤山市| 平塘县| 邵阳市| 墨江| 洱源县| 海南省|