一、请填写BOOL、float、指针变量 与 “零值”比较的if 语句:
二、用变量a给出下面的定义
a) 一个指向整数的指针
b)一个指向指针的指针,它指向的指针是指向一个整型数
c) 一个指向有10个整型数数组的指针
三、 以下为Windows NT 下的32位 C++程序,请计算 sizeof 的值
char str[] = "Hello";
char *p = str;
int n = 10;
请计算: sizeof(str) = sizeof(p) = sizeof (n) =
四、简答题
1、介绍内存的几大区域
2、用预处理指令 #define 声明一个常数,用以表明一年中有多少秒
3、请简述以下两个for循环的优缺点
第一种:
for (i = 0 ; i < N ; i++ ){
if (condition)
DoSomething();
else
DoOtherthing();
}
第二种:
if (condition){
for (i = 0; i < N ; i++)
DoSomething();
}else {
for (i = 0; i < N ; i++)
DoOtherthing()
}
4、 对于属性NSString *title 用重新变法实现synthesized 方法即实现自己的getter 和setter方法
5、怎么防止别人反编译你的app?
6、我们说的objective-c是动态运行时语言是什么意思?
7、开发中回调有三种方式: delegate 、 notification、target-action 介绍一下这三种方式,并说明它们之间的不同
8、使用GCD 如何实现这个需求, A\B\C三个任务并发,完成后执行任务D
9、在swift 中变量类型后面添加问号? 和感叹号 ! 代表什么?
五、 有关内存的思考题
第一种
void GetMemery2(char **p , int num){
*p = (char *) malloc (num);
}
void Test (void){
char *str = NULL;
GetMemory(&str, 100);
strcpy(str, "hello");
printf(str);
}
请问运行Test 函数会有什么样的结果?
第二种
char *GetMemory(void){
char p [] = "hello world";
return p;
}
void Test(void){
char *str = NULL ;
str = GetMemory();
printf(str);
}
请问运行Test 函数会有什么样的结果
六、使用objective-c编程实现排序算法中的快速排序
七、口头的问题:SDWebImage 框架,内部的实现是这样的?
八、口头问题:多线程有几种方式,GCD有哪几种方法
九、口头问题:tableView的优化处理
十、口头问题:事件响应链,比如一个按钮的点击
十一、口头问题:介绍keyWindow
十二、口头问题:有用过映射嘛?
后续添加答案,有答案的小伙伴请在下面评论作为参考哦!
一、
Bool a ; if (a){ // 代表true }else{ // 代表false }
嗯,这个 float 比较复杂了,零值:接近 0.000001(----需要细究
指针就是 if(a){ // 这样就表示是否存在了~ } // 反正不能写nil, 也不能写NULL ; // 此时面试官已经对我很崩溃了~~
二、
int *a
int **a
int * a[10]
三、在32位中,int 类型都是4字节,一个指针都是4个字节
sizeof(str) = 6
sizeof(p) = 4
sizeof(n) = 4
int 类型16位是2个字节,64位是8个字节
四、(参考地址 )
1、介绍下内存的几大区域?
内存分配方式:
【1】静态存储区域分配,内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在、例如全局变量,static 变量;
【2】、在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放,栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限
【3】、从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存(Objective-C是 release),动态内存的生存期由程序员决定,使用非常灵活,但如果在堆上分配了空间,就有责任回收它,否则运行的程序会出现内存泄漏,频繁地分配和释放不同大小的堆空间将会产生堆碎块。
2、程序的内存空间
一个由C/C++编译的程序占用的内存分为以下几个部分,
【1】、栈区 (stack) - 由编译器自动分配释放,存放为运行函数而分配的局部变量、函数参数、返回数据、返回地址等,其操作方式类似于数据结构中的栈。
【2】、堆区(heap)- 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收,分配方式类似于链表。
【3】、全局区(静态区static)- 存放全局变量、静态数据、常量。程序结束后由系统释放。
【4】、文字常量区-常量字符串就是放在这里的,程序结束后由系统释放。
【5】、程序代码区-存放函数体(类成员函数和全局函数) 的二进制代码
总的来说有这几种:内存区域有栈、堆、文字常量区、静态存储区、代码区
2、用预指令表示一年有多少秒
#define (365 * 24 * 60 * 60)UL
define 不能以分号结束,括号的使用
这个表达式将使一个16位机的整型数溢出-因此要用到长整型符号L,告诉编译器这个常数是的长整型。
如果你在你的表达式中用到UL(表示无符号长整型)。
3、两个for 循环一个是在循环中判断,一个是判断后循环,第一个在循环中判断是打断执行,消耗性能;
4、对于NSString * title需要写getter和setter方法:
-(void)setTitle:(NSString *)title{
_title = [title copy];
[title release];
}
5、怎么防止别人反编译你的app ?
首先知道他们如何反编译你的app:
【1】、插件法(仅越狱),iTools工具替换文件法(常见为文档破解),八门神器修改。
【2】、网络安全风险:截获网络请求破解通信协议并模拟客户端登录,伪造用户行为,对用户数据造成危害。
【3】、应用程序函数PATCH破解,利用FLEX补丁软件通过派遣返回值来对应进行patch破解。
【4】、源代码安全风险,通过使用ida等反汇编工具对ipa进行逆向汇编代码,导致核心代码逻辑泄露与被修改,影响应用安全。
以下的加密技术:
【1】、对NSUserDefaults , sqlite文件数据加密,保护账号和关键信息;
【2】、URL 编码加密,对程序中出现的URL进行编码加密,防止URL被静态分析。
【3】、对客户端传输数据提供加密方案,有效防止通过网络接口的拦截获取数据
【4】、对应用程序的方法名和方法体进行混淆,保证源代码被逆向后无法解析代码
【5】、对应用程序逻辑结构进行打乱,保证源代码可读性降到最低。
6、我们说Objective-c是动态运行时语言是什么意思?
解:因为objective-c 的标志性特性就是它的消息机制,(知乎上的“不二乎”)的答案似乎比较好,虽然也有网友(知乎上的“冯东”)说到真正的原理 ,runtime的使用了多少 bookkeeping数据,但是面试官比较喜欢听到的是这样的吧:
1、类和对象都是 id, 在给你一个id的前提下,无法直观的知道这个对象是类对象还说类本身,简单的可以简化成runtime管理的都是id,(id 的本质其实是objc_object, objc_class头部其实就是id, 也就是isa).
2、Class在objc中是动态创建的,selector, method ,imp, protocol都是随后绑定上去的,(即所谓的运行时绑定)
3、通过runtime能够查出当前运行时的环境中所有的类,每个类中的方法,每个类消息的绑定,每个类的实现协议,每个协议的定义,每个类当前消息换成等一切你想知道的东西。
4、类的方法(消息)调用是间接的。