ios学习之常见问题记录

时间:2023-03-09 10:03:10
ios学习之常见问题记录

使用Core Data的好处和缺点?

首先这是apple官方极力推荐的,使用它而不是SQLite。好处有大概这么几点:1.减少你model层的代码量,减少50%~70%。无需测试和优化。2.提供了内存缓存机制,提供了最优的内存扩展性。3.sqllite是关系型数据库,core data是面向对象的。

缺点是使用比较复杂,无法直接不能设置数据库的主键

关于为什么id是任意类型的指针?

你可以通过id指向任意对象,通过看其定义你就会理解其原理,定义如下:

ypedef struct objc_class *Class;

typedef struct objc_object {

Class isa;

} *id;

id中有一个isa变量,这个变量是用来指定响应类的方法的,每一个类都有一个特定的isa变量。也就是说当你传入不同类型时,你可以通过更改isa指向的类来实现其可以时不同类的指针。

关于报:error: failed to attach to process ID 0

首先,明确一下这个问题原因,无法找到所要启动应用线程。那有哪些时候会出现这个问题呢,下面分两种情况:

1.编译出错,这个就是网上很多人所说的,然后其解决方法也是大众化的,如直接删除应用,再重新运行。或者还原模拟器设置即可。

2.项目版本更新,项目文件架构更改:这个弄了整整一下午,问题原因是前后项目的可执行文件名不一样导致的。所以其解决方法就是把前后的项目可执行文件名改一致!而若使用上面的方法,则是治标不治本的,因为你无法跟用户说你把之前项目删了再更新吧!还有就是有这种情况,也就是这两天做的:就是新项目的数据库设计更改,但需要从老数据库中导出部分用户数据,这时候你如果删除项目,那也就什么都没了。这里简要说下版本更换,保持数据的做法:当你更新的时候,有一个文件夹是不会被更新置换掉的,那就是documents沙盒文件夹,所以你可以把你的项目数据库。db文件放里面。进行数据库数据迁移时,你只需要写一个适配器,把原来老数据的数据转换成你需要的新数据格式即可!(ps。判断第一次启动的方法是判断老版本的数据库文件是否存在,存在则是第一次启动,然后开始更新迁移数据,最后把老版本数据库文件删除)。

如何输出bool类型?

如你有一个 bool型 变量 :  IfReadOnly ; 你想在控制台输出 它的值。 在程序中想看到他的值的地方 加入如下代码:

NSLog(@"ifReadOnly value: %@" ,ifReadOnly?@"YES":@"NO");

找不到xib文件:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil;

注意此方法中nibNameOrNil是指对应的xib文件名

使用NSLog直接输出NSString,出现黄色警告:Format string is not a string literal (potentially insecure)

原因:在Xcode 4.2(iOS 5)之后,貌似苹果更新的编译器,出了支持ARC的Apple LLVM compiler 3.0。
在*和iPhone Dev SDK查找相关答案之后,发现在最新版的编译器里面NSLog为了安全,只接受格式化的字符串,因为NSLog底层也是用printf来格式化输出的。

解决:

NSLog(language,nil);

使用addTarget时出现警报,错误:Receiver type 'SJTabButton' for instance message is a forward declaration

原因:ARC要求明显的前向引用

解决:加入相应的头文件,如SJTAbButton。h即可

关于IB的连接线方向:

有的是从控制器拖拽到视图,有的是从视图拖拽到控制器。这里说一个最简单的判断方法,如果是IBOutlet,就是从视图到控制器,如果是IBAction,就是从控制器到视图。

关于数据库String类型的日期和int类型的数据装换:

+(NSTimeInterval)dateDecode:(NSString*)dateFormat{

NSDateFormatter *dateFormatter = [[NSDateFormatteralloc] init];

[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

return  [[dateFormatter dateFromString:dateFormat]timeIntervalSince1970];

}

xcode 设置显示欢迎画面:

有次觉得麻烦就把勾去掉,之后觉得没有更加麻烦。。

解决方法是:快捷键Command + Shift + 1直接更改

frame和bounds的区别

frame和bounds是UIView中的两个属性(property)。

frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)

bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)

-(CGRect)frame{
  return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
  return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}