一、写出ios方法获取ios内存使用情况
1.获取当前设备可用内存及所占内存的头文件
#import <sys/sysctl.h>
#import <mach/mach.h>
2.获取当前设备可用内存(单位:MB)
- (double)availableMemory
{
vm_statistics_data_t vmStats;
mach_msg_type_number_t infoCount =HOST_VM_INFO_COUNT;
kern_return_t kernReturn = host_statistics(mach_host_self(), HOST_VM_INFO, (host_info_t)&vmStats, &infoCount);
if (kernReturn != KERN_SUCCESS) {
return NSNotFound;
}
return ((vm_page_size *vmStats.free_count) /1024.0) / 1024.0;
}
3.获取当前任务所占用的内存(单位:MB)
- (double)usedMemory
{
task_basic_info_data_t taskInfo;
mach_msg_type_number_t infoCount =TASK_BASIC_INFO_COUNT;
kern_return_t kernReturn =task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&taskInfo,
&infoCount);
if (kernReturn != KERN_SUCCESS
) {
return NSNotFound;
}
return taskInfo.resident_size / 1024.0 / 1024.0;
}
二、什么是安全释放?
答:置为nil再释放
三、什么是序列化和反序列化?
答:序列化是把对象转化成字节序列的过程,反序列化是把字节序列恢复成对象,序列化和反序列化可以将对象写入到文件或者数据库里
四、获取一台设备唯一标示的方法?
1.UDID,UDID全称是Unique Device Identifier,顾名思义,他就是苹果iOS设备的唯一识别码,他由40个字符的字母和数字组成。(已越狱手机不适用)
代码中获取UDID:自从iOS5之后,苹果就禁止了通过代码访问UDID,在这之前,可以使用[[UIDevice cuurrent] uniqueIdenfier] 这个方法来获取某设备UDID。苹果提供了一个参数identifierForVendor来替代原来UDID的作用。通过代码实现如下:
NSUUID *uuid = [UIDevice currentDevice].identifierForVendor;
这个identifierForVendor是应用和设备两者都有关的
2.UUID,Universally Unique Identifier,通用唯一标识符,为了保证UUID的唯一性,规范定义了包括网卡MAC地址、时间戳、名字空间、随机或者伪随机数、时许等元素生成UUID算法。
最简单获取UUID的代码如下:
// 循环10次,每一次打印的值都是不一样的,当然循环的再多,这个值永远不会出现两个一样的值。
NSString *uuid = [NSUUID UUID].UUIDString;
苹果公司建议使用UUID为应用生成唯一标识字符串。虽然UUID是官方提出的一种替代UDID的建议方案。但系统升级后UUID可能会发生变化。
3.MAC Address
APP中需要一个能够标识设备唯一性的ID怎么办?
1.Mac地址+bundle_id
2.推送token+bundle_id
五、ios类是否可以多继承,如果没有,那可以使用其他方法实现吗?简述实现过程
答:不可以多继承,使用protocol实现
六、Block和函数指针的区别
答:1. 函数指针是对一个函数地址的引用,这个函数在编译的时候就已经确定了。Block是一个函数对象,是在程序运行过程中产生的。
七、怎样判断某个cell是否显示在当前屏幕上?
答:1.标记的cell 在tableview中的坐标值
2.当前cell在屏幕中的坐标值
3.坐标值和当前tableveiw的偏移量相比较
八、cocoa Touch 提供了几种core?
答:常用3中: 1.Core Animation,2.Core Audio,3.Core Data
Cocoa实际上有三个框架组成:
1.Foundation框架 2.Core Data框架 3.AppKit框架
Cocoa Touch 有三个框架组成:
1.Foundation框架 2.Core Data框架 3.UIKit框架
九、自动释放池什么时候创建,什么时候销毁?
1.启动runloop时候第一次创建
2.runloop退出的时候最后一次销毁
3.其他时候的创建和销毁:当runloop即将睡眠时销毁之前的释放池,重新创建一个新的。
十、NSMutableArray用copy修饰会出现什么问题?
添加,删除,修改数组内的元素的时候,程序会因为找不到对应的方法而崩溃,因为copy就是复制了一个不可变NSArray的对象。
十一、@property的本质是什么?ivar、getter、setter、如何生成并添加到这个类中的?
答:本质:@property = ivar+getter+setter;(实例变量+getter方法+setter方法)
在编译期自动生成getter、setter,还自动向类中添加适当类型的实例变量,也可以用@synthesize 语法来指定实例变量的名字。
十二、@synthesize和@dynamic分别有什么用?
答:
1.@property 有两个对应的词,一个@synthesize ,一个时@dynamic。如果@synthesize和@dynamic都没有写,那么默认的就是@synthesize var = _var;
2.@synthesize 的语意时如果你没有手动实现setter和getter方法,那么编译器会自动给你加上者两个方法。
3.@dynamic 告诉编译器:属性的setter和getter方法是由用户自己实现,不自动生成(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没有问题,但是程序运行到instance.var = someVar,由于缺少setter方法会导致程序崩溃,或者当运行到someVar=var时,由于缺少getter方法同样会导致崩溃。编译时没有问题,运行时才执行相应的方法,这就是所谓的动态绑定。
十三、ARC下不显式指定任何属性关键词时,默认的关键词都有哪些?
答:
1.基本数据类型:atomic、readwrite、assing
2.普通的OC对象,automic、readwrite、strong
十四、14.NSString、NSArray、NSDictionary经常使用copy修饰,如果改为strong会产生什么问题?
@property (nonatomic,strong)NSString *myStr1;
@property (nonatomic,copy)NSString *myStr2;
NSMutableString *string = [[NSMutableString alloc] initWithString:@"123"];
self.myStr1 = string;
self.myStr2 = string;