iPhone开发错误集

开始iPhone的Practise Project,其中有很多的问题,先记录起来,以免以后再犯:

 

      1.  EXC_BAD_ACCESS:

      发生场景1:一个指针转了两次,release了两次,其实只要release一次就可以。或者用指针时避免到处赋值。

      发生场景2:在一个View Controller A里动态加载另外一个View Controller B, B中无法使用UITableViewDelegate。

 

     2.  Debug里出现一批Leaking的警告错误:

     发生场景:使用了NSThread造成的。如下调用:

    [ NSThread detachNewThreadSelector: @selector ( scheduleTask ) toTarget: self withObject: nil ];  

      那么在-(void ) scheduleTask;中比如加入pool管理,即可防止出现此类错误:

      -(void ) scheduleTask {

       //create a pool 

       NSAutoreleasePool *pool = [[ NSAutoreleasePool alloc ] init ];

         //...your code write here. 

       //release the pool;

      [pool release ];

       }

 

     3. 在非主线程中,不要干创建UIView之类的活,而应该放到主线程去做,可以在非主线程里做UIView的显示更新等操作。

 

     4. 循环读取数据到数组时,请不要用以下方式(会报Leaks):

while  (sqlite3_step(statment)  ==  SQLITE_ROW) {
            City  * city   =  [[City alloc] init];

           
// 取值

           [citys addObject:city];

            [city release];
            city 
=  nil;

 

   而应该用如下方式:

 City  * city;

while  (sqlite3_step(statment)  ==  SQLITE_ROW) {
            city  
=  [[City alloc] init];

           
// 取值

           [citys addObject:city];

            [city release];
            city 
=  nil;

 

    5. Xcode 项目连上SCM后,提交时出现“125001 bogus filename ” 错误,什么path含有'.',目前尚未解决。

 

    6. 数据里定义一个实体对象,不能直接取这个对象的某个属性。

 

    7.当用以下代码跳转View的时候,在跳转的Controller里需要屏蔽initWithNibName 方法,否则View无法显示。

  代码

 

    8. 用sqlite时,出现Undefined symbols: “_sqlite3_free”, referenced from: ,  类似错误,后查询发现,忘了把把sqlite的库文件引用来项目里。

    9. 关于超时:当用如下方式设置request的timeout时,发现根本不起作用,timeout依然是默认的240秒。碰到这类问题,可用NSTimer来控制是否超时,然后进行处理。

  NSMutableURLRequest *request = [[ NSMutableURLRequest alloc] initWithURL:[ NSURL URLWithString: URI ] cachePolicy: NSURLRequestReloadIgnoringLocalAndRemoteCacheData timeoutInterval: 5.0f ];  

 

    10.代码检查:

If you're using xCode 3.2 and above in the build menu you can just select build & analyze, and it will give you the results in the build results.  

 

    11. UITableView中,实现该方法时注意- (UITableViewCell *)tableView:(UITableView *)tableView 

         cellForRowAtIndexPath:(NSIndexPath *)indexPath

           如果cell里有新添加的控件,只需要在第一次添加,每次滚动时改变控件里的显示值即可。

如: 代码

 

   12. 在tableView的Cell中使用自定义的View时,如果tableView有删除新增动作时,table row的内容会显示混乱。

 

   13. 在UIViewController里添加子UIViewController时,不需要子UIViewController进行释放。 当把子View移除时,第一次会调用dealloc,此后每次add,remove都不再调用dealloc。估计是ios的缓存。

 

   14. UITableView为group类型时,要想收缩或者展开某一个section,需用一个取巧的方式,比如设置section的高度,然后再 reload section。网上用beginEdit,和endEdit来实现,不过整个tableview都会刷新,感觉用户体验不太好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值