IOS- 02 零碎知识总结

时间:2021-07-21 08:22:46

1.UIView,UIViewController,UIWindow和CALayer

UIView是什么,做什么:UIView是用来显示内容的,可以处理用户事件

CALayer是什么,做什么:CALayer是用来绘制内容的,对内容进行动画处理依赖与UIView来进行显示,不能处理用户事件。

为何有两套结构

并不是两套体系,UIView和CALayer是相互依赖的关系。UIView依赖与calayer提供的内容,CALayer依赖uivew提供的容器来显示绘制的内容。归根到底CALayer是这一切的基础,如果没有CALayer,UIView自身也不会存在,UIView是一个特殊的CALayer实现,添加了响应事件的能力

结论:

UIView来自CALayer,高于CALayer,是CALayer高层实现与封装。UIView的所有特性来源于CALayer支持。

  • 在iPhone开发中,一个应 用程序应该只有一个UIWindow的 实例,UIWindow在iPhone中是UIView的一个特殊子类,在程序初始化时,通过装载 MainWindow.xib或者在代码中创建,它的大小应该就是手机屏幕的大小,并且不应该像普通的UIView一样,设置UIWindow实例——一 个特殊的UIView实例——的UIView中的属性。
  • 一个UIView的实例就是一个视图,表示的是屏幕上的一块矩形区域,负责这块矩形区域的描绘以及和用户的交互。一个UIView的实例也可以管理若干个子UIView,这和Windows编程中HWND句柄所指向的窗口的概念是类似的。
  • 一个 UIViewController 的实例往往对应一组UIView,这一组UIView的特征是充满一整个屏幕,并且同时出现同时消失,也可以认为一个 UIViewController对应的是一个屏幕的界面,来管理这个屏幕的界面的数据,以及这个屏幕的界面所需要做出的对某些事件的相应,如一个屏幕的 出现,消失,甚至是屏幕方向的变化等等。一个UIViewController的实例必然对应至少一个UIView实例,而这个UIView的实例应该是 一个全屏的视图对象

2.同步请求和异步请求的细节

// 建立网络访问

NSURL *url = [NSURL URLWithString:@"127.0.0.1"];

NSURLRequest *request = [NSURLRequest requestWithURL:url];

// 异步请求(sendAsynchronousRequest类方法,本身会开启一条新的线程,执行网络请求。不会让程序暂停)

sendAsynchronousRequest类方法,本身会开启一条新的线程,执行网络请求。

// 参数queue(操作队列)用于指定网络请求结束后的处理程序执行所在的线程

[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *connectionError) {

// 块代码中的程序会在参数queue指定的操作队列中执行

NSLog(@"下载完成 %@", [NSThread currentThread]);

}];

// 同步请求(sendSynchronousRequest不会开启新的线程,因此必须要网络请求完成之后,才会执行后续的代码)

sendSynchronousRequest不会开启新的线程,因此必须要网络请求完成之后,才会执行后续的代码

[ NSURLConnection sendSynchronousRequest:request returningResponse:<#(NSURLResponse *__autoreleasing *)#> error:<#(NSError *__autoreleasing *)#>];

// 使用同步异步的原则在于后续代码是否必须要使用到网络请求结束后的结果

3.property中属性retain,copy,assgin的含义分别是什么?有什么区别?

assign: 简单赋值,不更改索引计数  . [对基础数据类型 (NSInteger)和C数据类型(int, float, double, char,等)]
copy: 建立一个索引计数为1的对象,然后释放旧对象 . [对NSString]
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 . [对其他NSObject和其子类]

4.isKindOfClass 和 isMemberOfClass 的区别

两者都能检测一个对象是否是某个类的成员, 两者之间的区别是:isKindOfClass不但可以用来确定一个对象是否是一个类的成员,也可以用来确定一个对象是否是派生自该类的类的成员 ,而isMemberOfClass做不到后一点。
比如classA派生自NSObject类,classA* x = [classA new];   [x isKindOfClass:[NSObject class]] 可以检查出x是否是NSObject派生类的成员,但isMemberOfClass做不到

设施随即色

CGFloat red = (CGFloat)random()/(CGFloat)RAND_MAX;

CGFloat green = (CGFloat)random()/(CGFloat)RAND_MAX;

CGFloat blue = (CGFloat)random()/(CGFloat)RAND_MAX;

cell.sideColor.backgroundColor = [UIColor colorWithRed:red green:green blue:blue alpha:1.0];

Property's synthesized getter follows Cocoa naming convention for returning.

今天早上在整理代码的时候发现了如上警告。
在网上查询后发现,是因为苹果在新的编码,不推荐变量以new、copy等关键字开头。
突然响起来之前也有朋友问过类似的问题。特做以记录。
也希望大家在以后编码的时候,能够多多注意。