整理收集下面试基础,日常学习回忆下,也有助于基础巩固。(部分资料回答来源于网络搜索),如果有错误部分,欢迎指出改正或探讨。
2017.2.27
javascript基本数据类型:
字符串(String)、数字(Number)、布尔(Boolean)、数组(Array)、对象(Object)、空(Null)、未定义(Undefined)
2017/2/9更新
lldb(gdb)常用的调试命令?
• po:打印对象,会调用对象description方法。是print-object的简写
• expr:可以在调试时动态执行指定表达式,并将结果打印出来,很有用的命令
• print:也是打印命令,需要指定类型
• bt:打印调用堆栈,是thread backtrace的简写,加all可打印所有thread的堆栈
• br l:是breakpoint list的简写
2017/1/22更新
如何让计时器调用一个类方法
•计时器只能调用实例方法,但是可以在这个实例方法里面调用静态方法。
•使用计时器需要注意,计时器一定要加入RunLoop中,并且选好model才能运行。scheduledTimerWithTimeInterval方法创建一个计时器并加入到RunLoop中所以可以直接使用。
•如果计时器的repeats选择YES说明这个计时器会重复执行,一定要在合适的时机调用计时器的invalid。不能在dealloc中调用, 因为一旦设置为repeats为yes,计时器会强持有self,导致dealloc永远不会被调用,这个类就永远无法被释放。比如可以在viewDidDisappear中调用,这 样当类需要被回收的时候就可以正常进入dealloc中了。
[NSTimer scheduledTimerWithTimeInterval:1 target:selfselector:@selector(timerMethod) userInfo:nilrepeats:YES];
-(void)timerMethod
{
调用类方法
[[self class] staticMethod];
}
-(void)invalid
{
[timer invalid];
timer =nil;
}
id和NSObject*的区别
•id是一个objc_object结构体指针,定义是typedef structobjc_object *id
•id可以理解为指向对象的指针。所有oc的对象id都可以指向,编译器不会做类型检查,id调用任何存在的方法都不会在编译阶段报错,当然如果这个id指向的对象没有这个方法,还是会崩溃的。
• NSObject *指向的必须是NSObject的子类,调用的也只能是NSObjec里面的方法否则就要做强制类型转换。
•不是所有的OC对象都是NSObject的子类,还有一些继承自NSProxy。NSObject *可指向的类型是id的子集
category和extension的区别
• category:分类有名字,类扩展没i有分类名字,是一种特殊的分类
• extension:分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法
define和const常量有什么区别?
• define在预处理阶段进行替换,const常量在编译阶段使用
•宏不做类型检查,仅仅进行替换,const常量有数据类型,会执行类型检查
• define不能调试,const常量可以调试
• define定义的常量在替换后运行过程中会不断地占用内存,而const定义的常量存储在数据段只有一份copy,效率更高
• define可以定义一些简单的函数,const不可以
block和weak修饰符的区别?
•__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,也可以修饰基本数据类型
•__weak只能在ARC模式下使用,只能修饰对象(NSString),不能修饰基本数据类型
• block修饰的对象可以在block中被重新赋值,weak修饰的对象不可以
static关键字的作用
•函数(方法)体内static变量的作用范围为该函数体,该变量的内存只被分配一次,因此其值在下次调用时仍维持上次的值;
•在模块内的static全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
•在模块内的static函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明 它的模块内;
•在类中的static成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
•在类中的static成员函数属于整个类所拥有,这个函数不接收this指针,因而只能访问类的static成员变量