IOS常见错误纠正和使用心得

来源:互联网 发布:51单片机电机参数 编辑:程序博客网 时间:2024/06/06 07:11

1.发现图片没下载下来,即imageLoadFinished方法始终没有执行

可能原因:没有获取到图片的url,即传过来的url是空的,检查解析是否获得,传值时是否传到。

2.注意观察接口返回来的jason数据格式,针对不同的格式采取不同的解析方法

(1) 返回的数据格式是这样的


即是Dictionary类型,那么获取里面的img1应该这样:

NSMutableDictionary  *data = [[adBean.imageUrlJSONValue]retain];//将iason数据转化为Dictionary 类型

NSString *image=[data objectForKey:@"img1"];//这样就取到了img1的url,可以去进行下载了

(2) 返回的数据格式是这样的


这是数组,然后里面嵌套Dictionary,,那么获取里面的img_m应该这样:

NSArray *data = [[adBean.imageUrlJSONValue]retain];//将iason数据转化为NSArray 类型

NSMutableDictionary *image=[data objectAtIndex:1];

  NSString *m=[image objectForKey:@"img_m"];//这样就取到了img_m的url,可以去进行下载了

3.有时候看别人代码时会出现这种情况,很多if和else,不知道怎么个对应关系,这时可以用如下方法轻松获取对应关系:

找到if或者else后面对应的“{”,用鼠标单击。会发现有一块蓝色区域,这就是他们所包含的整个逻辑。

4.声明一个属性以后,在使用的时候需加上self.x

例如:在.h文件中声明一个属性

{

 NSArray *array;

}

@property(nonatomic,retain)NSArray *array;

那么在.m文件中使用array时,都需加上self,即self.array=........

5.注意尽量少使用NSUserDefaults

NSUserDefaults是用来存储一些配置信息的,如果不是那种下次登录还要获取上次登录信息的内容,应尽量不要使用。但是有时候需要在文件中传输一些数据时,不使用NSUserDefaults,那么应该怎么办呢?解决方法如下:

例如:在b文件中需要将数据传输到a文件,那么可以在a文件中写一个方法,在b中调用a中的方法,将数据传输过去。

6.在tableView中显示图片,在滚动页面查看图片的时候会出现这种情况:图片总是现显示一个图片,再被要展示的图片覆盖(图片是从网上获取的)

原因:tableviewCell的重用机制,每次展示都是回收之前的cell,所以在展示需要展示的图片时总是先显示之前cell的信息,然后要展示的信息将之前的覆盖

解决办法:在每一次展示图片之前先将数据清空

设定一个全局变量

SearchproductBean *bean;

-(void)setBean:(SearchproductBean *)tb{

if(bean){//在每次展示时先做一个判断,之前存储的有数据,那么就清空。然后再将新数据赋值给bean

            [bean release];

            bean=nil;

        }

        bean=[tbretain];


if (bean.pictureUrl) {//下载图片

            [imageDownloaderloadImageWithURl:bean.pictureUrl];

        }


}

7.在加载下一页的时候,会将要展示的页面的图片和之前页面所有的图片重新刷新一下,可是想实现的效果是,已经存在的图片不需要再刷新

解决办法:展示数据时,先判断图片的Url,如果之前存的数据里面的图片url和当前获取来的图片url一样,那么就什么都不做

-(void)setBean:(SearchproductBean *)tb{

if (bean&&[bean.pictureUrlisEqualToString:tb.pictureUrl]) {

       //什么都不做

    }else{

        if(bean){

            [bean release];

            bean=nil;

        }

        bean=[tbretain];

       if (bean.pictureUrl) {

            [imageDownloaderloadImageWithURl:bean.pictureUrl];

        }

}

8.出现闪退

可能原因:内存过度释放,即有的内存不需要释放,但是被用户释放了

9.报错,提示出错不是代码的问题

可能原因:有的文件缺失,或者有的库文件没有导入成功,查看工程中是否有空的,红色显示出来的文件,那就是没导入成功,或者缺失。删掉红色的空文件,重新导入即可

10.发现程序突然挂掉或者一开始运行的时候就挂掉

可能原因:内存过度释放

11.retain后就不需要alloc,因为retain和alloc的作用都是一样的,使计数器加1,如果二者同时使用,那么一定要记得释放内存;

12.在开发的过程中可能会使用到代理delegate,有时候发现delegate方法在a页面都写好了,在b页面也可以使用代理方法,可是运行时发现就是不执行

可能原因:代理没有设置。少了这条语句:XXX.delegate=self;(注意:代理在使用完了一定要置为nil)

13.处理历史搜索中发现已经调用方法请求删除搜索历史记录,也让tableview重新获取数据了([dataTabView  reloadData]),可是tableview还是有之前的数据

可能原因:调用只请求服务器那边删除搜索内容,可是本地的数据没有删除,需要开发者自己手动删除。

//删除服务器上面的数据

SearchKeyWordHistoryHelper *helper =[[SearchKeyWordHistoryHelperalloc]init];

 [helper deleteAllSearchWord];

[helper release];

//手动删除本地数据

self.searchHistoryArray=nil;(searchHistoryArray已经声明为属性,它的释放在dealloc里面。此处不需要再次release)

//最后重新获取数据

[dataTabView  reloadData];

14.已经声明为属性的变量。不需要再在调用的过程中出现if(array){[array release];}这是错误的;

原因:这样逻辑比较混乱。已经声明为属性的变量,它的释放都在dealloc中

15.在页面跳转过程中想实现如下效果:

(1)tabbar也跟着跳转

[self.navigationControllerpushViewController:controlleranimated:YES];

(2)tabbar不跟着跳转

[self.tabBarController.navigationControllerpushViewController:controlleranimated:YES];

16.两个文件循环引用会报错

循环引用,即在a文件中import b文件,在b文件中又import a 文件。这样程序会一直报错。解决办法:

(1)在a的.h文件中@class b;

(2)在a的.m文件中#import b

17.如果button是自定义的,那么不能release

例如:

       cancleButton = [UIButtonbuttonWithType:UIButtonTypeCustom];

        cancleButton.frame  =CGRectMake(282,32,40,40);

        cancleButton.showsTouchWhenHighlighted=NO;

        [cancleButton addTarget:selfaction:@selector(cancelBUttonClicked)forControlEvents:UIControlEventTouchUpInside];

        cancleButton.backgroundColor=[UIColorclearColor];

        [self.view addSubview:cancleButton];

         [cancleButtonrelease];

这样系统会报错,原因是button的计数器一直没变,是0.release后变为-1.是错误的