Objective-C 中是否支持垃圾回收机制?
OC是支持垃圾回收机制的(Garbage collection简称GC),但是apple的移动终端中,是不支持GC的,Mac桌面系统开发中是支持的.
移动终端开发是支持ARC(Automatic Reference Counting的简称),ARC是在IOS5之后推出的新技术,它与GC的机制是不同的。我们在编写代码时, 不需要向对象发送release或者autorelease方法,也不可以调用delloc方法,编译器会在合适的位置自动给用户生成release消息(autorelease),ARC 的特点是自动引用技术简化了内存管理的难度.
当我们调用一个静态方法时,需要对对象进行 release 吗?
- 不需要,静态方法(类方法)创建一个对象时,对象已被放入自动释放池。在自动释放池被释放时,很有可能被销毁。
在某个方法中 self.name = _name,name = _name 它 们有区别吗,为什么?
前者是存在内存管理的setter方法赋值,它会对_name对象进行保留或者拷贝操作
后者是普通赋值
一般来说,在对象的方法里成员变量和方法都是可以访问的,我们通常会重写Setter方法来执行某些额外的工作。比如说,外部传一个模型过来,那么我会直接重写Setter方法,当模型传过来时,也就是意味着数据发生了变化,那么视图也需要更新显示,则在赋值新模型的同时也去刷新UI。
UITableViewCell上有个UILabel,显示NSTimer实现的秒表时间,手指滚动cell过程中,label是否刷新,为什么?
这是否刷新取决于timer加入到Run Loop中的Mode是什么。Mode主要是用来指定事件在运行循环中的优先级的,分为:
NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
UITrackingRunLoopMode:ScrollView滑动时会切换到该Mode
UIInitializationRunLoopMode:run loop启动时,会切换到该mode
NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集合
苹果公开提供的Mode有两个:NSDefaultRunLoopMode(kCFRunLoopDefaultMode)
NSRunLoopCommonModes(kCFRunLoopCommonModes)
在编程中:如果我们把一个NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环中的时候, ScrollView滚动过程中会因为mode的切换,而导致NSTimer将不再被调度。当我们滚动的时候,也希望不调度,那就应该使用默认模式。但是,如果希望在滚动时,定时器也要回调,那就应该使用common mode。
网络七层协议
应用层:
1.用户接口、应用程序;
2.Application典型设备:网关;
3.典型协议、标准和应用:TELNET、FTP、HTTP表示层:
1.数据表示、压缩和加密presentation
2.典型设备:网关
3.典型协议、标准和应用:ASCLL、PICT、TIFF、JPEG|MPEG
4.表示层相当于一个东西的表示,表示的一些协议,比如图片、声音和视频MPEG。会话层:
1.会话的建立和结束;
2.典型设备:网关;
3.典型协议、标准和应用:RPC、SQL、NFS、X WINDOWS、ASP传输层:
1.主要功能:端到端控制Transport;
2.典型设备:网关;
3.典型协议、标准和应用:TCP、UDP、SPX网络层:
1.主要功能:路由、寻址Network;
2.典型设备:路由器;
3.典型协议、标准和应用:IP、IPX、APPLETALK、ICMP;数据链路层:
1.主要功能:保证无差错的疏忽链路的data link;
2.典型设备:交换机、网桥、网卡;
3.典型协议、标准和应用:802.2、802.3ATM、HDLC、FRAME RELAY;物理层:
1.主要功能:传输比特流Physical;
2.典型设备:集线器、中继器
3.典型协议、标准和应用:V.35、EIA/TIA-232.
关键字volatile有什么含意?并给出三个不同的例子:
- 一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
- 并行设备的硬件寄存器(如:状态寄存器);
- 一个中断服务子程序中会访问到的非自动变量(Non-automatic variables);
- 多线程应用中被几个任务共享的变量。
static 关键字的作用:
- 函数体内 static 变量的作用范围为该函数体,不同于 auto 变量,该变量的内存只被分配一次,
因此其值在下次调用时仍维持上次的值; - 在模块内的 static 全局变量可以被模块内所用函数访问,但不能被模块外其它函数访问;
- 在模块内的 static 函数只可被这一模块内的其它函数调用,这个函数的使用范围被限制在声明
它的模块内; - 在类中的 static 成员变量属于整个类所拥有,对类的所有对象只有一份拷贝;
- 在类中的 static 成员函数属于整个类所拥有,这个函数不接收 this 指针,因而只能访问类的static 成员变量。
C语音标识符
在程序中使用的变量名、函数名、标号等统称为标识符。除库函数的函数名由系统定义外,其余都由用户自定义。C 规定,标识符只能是字母(A~Z,a~z)、数字(0~9)、下划线()组成的字符串,并且其第一个字符必须是字母或下划线。
在使用标识符时还必须注意以下几点:
标准C不限制标识符的长度,但它受各种版本的C 语言编译系统限制,同时也受到具体机器的限制。例如在某版本C 中规定标识符前八位有效,当两个标识符前八位相同时,则被认为是同一个标识符。
在标识符中,大小写是有区别的。例如BOOK和book 是两个不同的标识符。
标识符虽然可由程序员随意定义,但标识符是用于标识某个量的符号。因此,命名应尽量有相应的意义,以便阅读理解,作到“顾名思义”。
类型所占字节
- 机器平台:X86_64 处理器 操作系统:Red Hat 4.1.2-14 编译器: gcc version 4.1.2 20070626
- Size of char is: 1
- Size of unsigned char is: 1
- Size of signed char is: 1
- Size of int is: 4
- Size of short is: 2
- Size of long is: 8
- Size of long int is: 8
- Size of signed int is: 4
- Size of unsigned int is: 4
- Size of unsigned long int is: 8
- Size of long long int is: 8
- Size of unsigned long long is: 8
- Size of float is: 4
- Size of double is: 8
- Size of long double is: 16
- Size of (void *) is: 8
- Size of (char *) is: 8
- Size of (int *) is: 8
- Size of (long *) is: 8
- Size of (long long *) is: 8
- Size of (float *) is: 8
- Size of (double *) is: 8
——————————————————————————
- 机器平台: X86_32 处理器 操作系统: Windows XP SP2 编译器: VS2005自带的C++编译器
- Size of char is: 1
- Size of unsigned char is: 1
- Size of signed char is: 1
- Size of int is: 4
- Size of short is: 2
- Size of long is: 4
- Size of long int is: 4
- Size of signed int is: 4
- Size of unsigned int is: 4
- Size of unsigned long int is: 4
- Size of long long int is: 8
- Size of unsigned long long is: 8
- Size of float is: 4
- Size of double is: 8
- Size of long double is: 8
- Size of (void *) is: 4
- Size of (char *) is: 4
- Size of (int *) is: 4
- Size of (long *) is: 4
- Size of (long long *) is: 4
- Size of (float *) is: 4
- Size of (double *) is:
自己打印的
- int 4
- double 8
*float 4 - NSString 8
- short 2
与或非
int main()
{
int a = 5 > 3; // 表示真
int b = 5 < 3; // 表示假
int x = a && a;
int y = a && b;
int z = b && b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = a || a;
y = a || b;
z = b || b;
printf("x = %d, y = %d, z = %d\n", x, y, z);
x = !a;
y = !b;
z = !(!a);
printf("x = %d, y = %d, z = %d\n", x, y, z);
return 0;
}
逻辑与:两边都为真时返回真,否则返回假;
逻辑或:只要任意一个为真就返回真,否则返回假;
逻辑非:符号右边是真,则返回假;符号右边是假,则返回真。
位运算
~取反,0取反是1,1取反是0
<<是左移,比如1<<n,表示1往左移n位,即数值大小2的n次方
右移,类似左移,数值大小除以2的n次方
&按位与,1与任意数等于任意数本身,0与任意数等于0,即1&x=x,0&x=0
|按位或,x|y中只要有一个1则结果为1
^按位异或, x ^ y相等则为0,不等则为1
所有数值必须转换为二进制数才能位运算,每一位数相对应运算(好像都是按照2进制算的)
SDWebImage 加载图片的流程
- 入口 setImageWithURL:placeholderImage:options: 会先把 placeholderImage 显示,然后 SDWebImageManager 根据 URL 开始处理图片。
- 进入 SDWebImageManager-downloadWithURL:delegate:options:userInfo:,交给 SDImageCache 从缓存查找图片是否已经下载 queryDiskCacheForKey:delegate:userInfo:.
- 先从内存图片缓存查找是否有图片,如果内存中已经有图片缓存,SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo: 到 SDWebImageManager。
- SDWebImageManagerDelegate 回调 webImageManager:didFinishWithImage: 到 UIImageView+WebCache 等前端展示图片。
- 如果内存缓存中没有,生成 NSInvocationOperation 添加到队列开始从硬盘查找图片是否已经缓存。
- 根据 URLKey 在硬盘缓存目录下尝试读取图片文件。这一步是在 NSOperation 进行的操作,所以回主线程进行结果回调 notifyDelegate:。
- 如果上一操作从硬盘读取到了图片,将图片添加到内存缓存中(如果空闲内存过小,会先清空内存缓存)。SDImageCacheDelegate 回调 imageCache:didFindImage:forKey:userInfo:。进而回调展示图片。
- 如果从硬盘缓存目录读取不到图片,说明所有缓存都不存在该图片,需要下载图片,回调 imageCache:didNotFindImageForKey:userInfo:。
- 共享或重新生成一个下载器 SDWebImageDownloader 开始下载图片。
- 图片下载由 NSURLConnection 来做,实现相关 delegate 来判断图片下载中、下载完成和下载失败。
- connection:didReceiveData: 中利用 ImageIO 做了按图片下载进度加载效果。
- connectionDidFinishLoading: 数据下载完成后交给 SDWebImageDecoder 做图片解码处理。
- 图片解码处理在一个 NSOperationQueue 完成,不会拖慢主线程 UI。如果有需要对下载的图片进行二次处理,最好也在这里完成,效率会好很多。
- 在主线程 notifyDelegateOnMainThreadWithInfo: 宣告解码完成,imageDecoder:didFinishDecodingImage:userInfo: 回调给 SDWebImageDownloader。
- imageDownloader:didFinishWithImage: 回调给 SDWebImageManager 告知图片下载完成。
- 通知所有的 downloadDelegates 下载完成,回调给需要的地方展示图片。
- 将图片保存到 SDImageCache 中,内存缓存和硬盘缓存同时保存。写文件到硬盘也在以单独 NSInvocationOperation 完成,避免拖慢主线程。
- SDImageCache 在初始化的时候会注册一些消息通知,在内存警告或退到后台的时候清理内存图片缓存,应用结束的时候清理过期图片。
- SDWI 也提供了 UIButton+WebCache 和 MKAnnotationView+WebCache,方便使用。
- SDWebImagePrefetcher 可以预先下载图片,方便后续使用
Normal
0
10 pt
0
2
false
false
false
EN-US
ZH-CN
X-NONE
$([{£¥·‘“〈《「『【〔〖〝﹙﹛﹝$(.[{£¥
!%),.:;>?]}¢¨°·ˇˉ―‖’”…‰′″›℃∶、。〃〉》」』】〕〗〞︶︺︾﹀﹄﹚﹜﹞!"%'),.:;?]`|}~¢
/* Style Definitions */table.MsoNormalTable {mso-style-name:普通表格; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:Cambria; mso-ascii-font-family:Cambria; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Cambria; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;}
关键字const什么含义?
const int a;
int const a;
const int *a;
int const *a;
int * const a;
int const * const a;
1> 前两个的作用是一样:a 是一个常整型数
2> 第三、四个意味着 a 是一个指向常整型数的指针(整型数是不可修改的,但指针可以)
3> 第五个的意思:a 是一个指向整型数的常指针(指针指向的整型数是可以修改的,但指针是不可修改的)
4> 最后一个意味着:a 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)