自己整理的知识点02

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<

  • 右移,类似左移,数值大小除以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 是一个指向常整型数的常指针(指针指向的整型数是不可修改的,同时指针也是不可修改的)

你可能感兴趣的:(自己整理的知识点02)