myNote

1.数组和链表有什么区别?

答:
二者都属于一种数据结构
从逻辑结构来看
1. 数组必须事先定义固定的长度(元素个数),不能适应数据动态地增减的情况。当数据增加时,可能超出原先定义的元素个数;当数据减少时,造成内存浪费;数组可以根据下标直接存取。
2. 链表动态地进行存储分配,可以适应数据动态地增减的情况,且可以方便地插入、删除数据项。(数组中插入、删除数据项时,需要移动其它数据项,非常繁琐)链表必须根据next指针找到下一个元素
从内存存储来看
1. (静态)数组从栈中分配空间, 对于程序员方便快速,但是自由度小
2. 链表从堆中分配空间, 自由度大但是申请管理比较麻烦

从上面的比较可以看出,如果需要快速访问数据,很少或不插入和删除元素,就应该用数组;相反, 如果需要经常插入和删除元素就需要用链表数据结构了。

2.C语言内存管理

(1)代码区(text segment)。代码区指令根据程序设计流程依次执行,对于顺序指令,则只会执行一次(每个进程),如果反复,则需要使用跳转指令,如果进行递归,则需要借助栈来实现。

代码区的指令中包括操作码和要操作的对象(或对象地址引用)。如果是立即数(即具体的数值,如5),将直接包含在代码中;如果是局部数据,将在栈区分配空间,然后引用该数据地址;如果是BSS区和数据区,在代码中同样将引用该数据地址。

(2)全局初始化数据区/静态数据区(Data Segment)。只初始化一次。

(3)未初始化数据区(BSS)。在运行时改变其值。(常量区)

(4)栈区(stack)。由编译器自动分配释放,存放函数的参数值、局部变量的值等。其操作方式类似于数据结构中的栈。每当一个函数被调用,该函数返回地址和一些关于调用的信息,比如某些寄存器的内容,被存储到栈区。然后这个被调用的函数再为它的自动变量和临时变量在栈区上分配空间,这就是C实现函数递归调用的方法。每执行一次递归函数调用,一个新的栈框架就会被使用,这样这个新实例栈里的变量就不会和该函数的另一个实例栈里面的变量混淆。

(5)堆区(heap)。用于动态内存分配。堆在内存中位于bss区和栈区之间。一般由程序员分配和释放,若程序员不释放,程序结束时有可能由OS回收。

堆和栈的区别
http://www.cnblogs.com/Kevin_z/archive/2010/03/05/1679031.html

3.NSDictionary的工作原理

从 NSDictionary.h 中可以看出,NSDictionary 的结构中最重要的应该是不断地维护着两个数组(NSArray),这里且称为 keyArray,valueArray。给 NSDictionary 对象赋值的时候,实现计算好存入数据的长度,然后给这两个数组分配同样长度的空间。这个时候就很清楚了,key 和 value 在两个数组中的下标是对应的。后面就都懂了。

相应的,NSMutableDictionary 中的两个数组对象类型为 NSMutableArray。

4. 第三方库

很多时候,项目紧急,不需要理解其原理,只需要懂得用即可。常见的第三方库在度娘一般都可以找到使用教程。当然,比如百度地图、分享类等基本都在官网有教程,照板搬豆腐就行。最靠谱的就是,它本身所自带的DEMO。

常见问题是少添加了头文件、少添加了frameWork,或者包没加好,导致 Search Paths中没有相关路径索引,此处建议使用通用的:$(SRCROOT)/thirdParty/…。 有时候还有可能多个包之间有冲突,比如关于base64的如果多个包中都有而引起冲突,那么就删掉其中一个里面的base64相关文件。 当然,有些包没有使用ARC,那么就要在 Biuld Phases -> Compile Sources 中相关文件后面添加 -fno-objc-arc 。

相关文章
相关标签/搜索