iOS常见问题(4)

时间:2023-03-09 02:47:26
iOS常见问题(4)

一、非ARC内存管理问题。

  有些同学在创建项目的时候忘记点ARC了,导致一些成员属性都莫名其妙的释放了。然后出现了一系列莫名其妙的错误。

在滚动UITableView的时候出现野指针错误。

  iOS常见问题(4)

  一出现这些野指针错误,首先应该想到某些对象被释放了,然后发现代码中,并没有什么造成对象被释放的情况,这时候应该马上想到很可能是非ARC弄的。下图为怎么查看项目是否是非ARC。

  iOS常见问题(4)

  在非ARC中没有强引用的概念,因此下图的成员变量是没有被强引用的。

  iOS常见问题(4)

  在看看下图,allPro数组没有通过alloc调用,没有调用alloc产生的对象都是自动释放的

 allPro=@[
@{
kCities:@[@"浦东",@"杨浦",@"闸北",@"闵行"],
kHeader:@"上海",
kFooter:@"上海不错"
},
@{
kCities:@[@"海淀",@"昌平",@"*"],
kHeader:@"北京",
kFooter:@"北京很好"
} ];

  所以在滚动的时候会出现野指针错误,因此需要将项目改成ARC。如下图

  iOS常见问题(4)

  iOS常见问题(4)

  两个勾都得选中,然后一直点确认就OK了。

二、数据模型属性采用的策略中除了基本类型需要用assign,字符串需要用copy,其他对象类型都需要用strong。而控制器中视图采用的策略需要根据情况而定。

  下图就是数据模型中属性用错了策略导致,UITableViewcell重新出现到界面时,会导致数据丢失。

  iOS常见问题(4)

三、想在点击cell时做些操作,方法选错了。

  下面两个方法太相似了,很容易选错。

 // 当点击一行cell时,会调用这个方法
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
// 当取消选择一行cell时,会调用这个方法
-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath

四、字符串小调试技巧

  当把一个字符串转换成基本数据类型时,字符串打印有值,但是转换成基本数据类型为0时,这个莫名其妙的问题,首先应该想到字符串中很可能有换行符合等,导致转换不成功。

  iOS常见问题(4)

NSString *str = @"                                                                                  123";
NSInteger i = [str integerValue];
NSLog(@"%@",str);
NSLog(@"%d",i);
碰到这种情况,可以在打印字符串的时候在占位符两边各加一个数字.
NSLog(@"1%@1",str);

  然后看打印结果就能知道有字符串中有多少空行了

  iOS常见问题(4)

  只要将空行去掉就能转换成功了。字符串去掉空格的方法:

// 此方法是通过什么字符集裁剪字符串。
- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;

  NSCharacterSet对象可以通过类方法创建

// 创建空格和换行字符集
[NSCharacterSet whitespaceAndNewlineCharacterSet];
// 创建空格字符集
[NSCharacterSet whitespaceCharacterSet];

五、下图的警告意思是:初始化时,类型指向不匹配,应该用NSArray * 而不是YZPerson *

  iOS常见问题(4)

  找到原因后,然后看person方法是怎么声明。

  iOS常见问题(4)

  解决方式:将NSArray * 改成id。

六、UITableView数据源问题

  1.1  iOS常见问题(4)

  错误原因:说YZViewController 没有实现 tableView:numberOfRowsInSection:

  解决方式:实现tableView:numberOfRowsInSection:

  1.2

  iOS常见问题(4)

  这里返回空,会报错。

  UITableView内部实现原理:

  数据源实现了这个方法

 -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

 //tableView内部自动会调用以下方法添加cell。
[tableView addSubview:cell]; //如果返回的cell为空,也就意味着生成下面一行代码。
[tableView addSubview:nil];

  而addSubview是将右边参数添加到数组中保存起来,而数组是不能添加空值的。所有集合对象都不能出传空。例如数组,字典,NSSet。

  以上错误总结:作为tableView的数据源必须实现两个方法。

  返回行数

  -(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;

  返回每一行显示的内容

  -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

  另外返回每一行显示的内容不能返回nil。

七、在数组删除一个模型,并不代表把这个模型给释放了。

  iOS常见问题(4)

  上面步骤二,仅仅是将模型从数组中销毁,而模型并没有被销。

八、stroyboard中显示的跟根视图是UIView,而stroyboard的控制器是UITableViewController就会报这个错误

  iOS常见问题(4)

  原因是:UITableViewController控制器不能加载UITableView,因为它会去加载stroyboard中的UIView。

  解决方式:将stroyboard中的UIView改成UITableView

九、自定义视图的属性命名冲突问题

  iOS常见问题(4)

  当发现自己描述的xib和运行的时候展现出来的不一样的时候,这时候已经想到自己命名的属性名称和系统命名的冲突了。

  错误原因:

  iOS常见问题(4)

  系统自带的UITableViewCell中也有imageView这个属性,因此冲突了。

  解决办法:将自定义视图的imageView属性名称改成iconView.

  注意:以后自定义属性命名不要和系统自带的属性名称相同。

十、链接错误

  iOS常见问题(4)

  以后看到duplicate这个词语,错误原因就是重复定义了类,函数方法等等。

  一般都是因为导入了.m文件

  错误:iOS常见问题(4)

  解决方式:将#import "newsCell.m"这一行删掉。