1.异步改同步,要求Aaa,Bbb,Ccc等顺序打印,要求多种方法
Aaa;
AsyncNetRequest^(id response){
// use response
Bbb;
}
ccc;
ddd;
fff;
...等
让异步改成同步,其实主要的思想就是用阻塞线程的方式。主要可以用下面的方式。
1.dispatch_semaphore_t
信号量来控制请求顺序 dispatch_semaphore_signal()
信号加1 dispatch_semaphore_wait()
信号减1。
[super viewDidLoad];
dispatch_semaphore_t semaphore = dispatch_semaphore_create(0);
[self methodC:^{
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self methodB:^{
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self methodA:^{
dispatch_semaphore_signal(semaphore);
}];
[self methodD:^{
dispatch_semaphore_signal(semaphore);
}];
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
[self method];
- 用while循环阻塞线程 达到异步改同步的效果
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",[self nameStr]);
NSLog(@"next");
}
- (NSString *)nameStr{
NSString __block * nameStr = @"小红";
__block BOOL _sleep = YES;
[self method:^(NSString *name) {
nameStr = name;
NSLog(@"1");
_sleep = NO;
NSLog(@"3");
}];
while (_sleep) {
//while循环等待阻塞线程
}
NSLog(@"2");
return nameStr;
}
3.利用dispatch_group_t 调度组 异步改同步 代码如下
- (NSString *)nameStr{
__block NSString * nameStr = @"小红";
dispatch_group_t group = dispatch_group_create();
dispatch_group_enter(group);
[self method:^(NSString *name) {
nameStr = name;
dispatch_group_leave(group);
}];
dispatch_group_wait(group, DISPATCH_TIME_FOREVER);
return nameStr;
}
2.写出以下代码的打印顺序
int main()
{
print Aaa;
dispatch_after_delay(1秒, ^{
// use response
print Bbb;
}
print ccc;
return 0;
}
会打印 Aaa和ccc,不会打印Bbb。原因就是这个不会开启
NSRunLoop
,程序按照顺序执行,所以在这个方法里,使用NSTimer
也不会执行。
3.NSDictionary、NSArray我们比较常用,那么它们分别的实现逻辑是怎么样的?C++的STL是什么?
STL,英文全称 standard template library,中文可译为标准模板库或者泛型库,其包含有大量的模板类和模板函数,是 C++ 提供的一个基础模板的集合,用于完成诸如输入/输出、数学计算等功能。
4.有一个UITabelView,有一千个网络图片需要用tableview来做一个列表的加载,cell有一个imageview用sdwebimage去显示图片。它首先会加载前边几个网络图片,如果滑动到底部,又会优先加载底部的网络图片,滑到中间又会优先加载中间的网络图片,它总是能优先加载当前看到区域的这些cell的图片,这是一个什么样的原理?
5.YYCache的原理说一下?
6.UIView和CALayer的关系是什么?CALayer有一个属性叫content,它是一个什么类型的?一般画一个渐变图片用什么layer?layer的mask是什么类型的?
CALayer有如下子类:
CALayer的子类一览
UIView
和CALayer
的关系:UIView
负责处理用户交互,负责绘制内容的则是它持有的那个CALayer
,我们访问和设置UIView
的这些负责显示的属性实际上访问和设置的都是这个CALayer
对应的属性,UIView
只是将这些操作封装起来了而已。contents
是一个类型为id
的属性,在iOS开发中,可以利用这个属性给CALayer
设置backing image
。
根据上图我们可以知道,设置渐变图片的时候,我们可以使用CAGradientLayer
这个子类。
在代码的注释中:
/* A layer whose alpha channel is used as a mask to select between the
* layer's background and the result of compositing the layer's
* contents with its filtered background. Defaults to nil. When used as
* a mask the layer's `compositingFilter' and `backgroundFilters'
* properties are ignored. When setting the mask to a new layer, the
* new layer must have a nil superlayer, otherwise the behavior is
* undefined. Nested masks (mask layers with their own masks) are
* unsupported. */
将其alpha通道用作蒙版的图层,以在图层的背景和将图层内容与其过滤背景进行合成的结果
之间进行选择。 默认为nil。 当用作蒙板时,图层的“compositingFilter”和
“backgroundFilters”属性将被忽略。 将遮罩设置为新图层时,新图层必须有一个nil的图层,
否则行为未定义。 不支持嵌套蒙版(带有自己蒙版的蒙版图层)。
@property(nullable, strong) CALayer *mask;
也可以这么理解:
- 是一个可选的layer,它的alpha通道用于遮罩图层的内容。图层的Alpha通道决定了有多少的图层的内容和背景的显示通过。 完全或部分不透明的像素允许底层内容显示,但完全透明的像素屏蔽该内容。
- 这个属性的默认值是nil。 配置mask时,请记得设置遮罩层的大小和位置,以确保遮罩层与它遮罩的层正确对齐。
- 您分配给此属性的图层不能有父图层。否则行为是不确定的。
- 遮罩层必须至少有两个图层,上面的一个图层为“遮罩层”,下面的称“被遮罩层”;这两个图层中只有相重叠的地方才会被显示。也就是说在遮罩层中有对象的地方就是“透明”的,可以看到被遮罩层中的对象,而没有对象的地方就是不透明的,被遮罩层中相应位置的对象是看不见的。
CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = CGRectMake(100, 300, 200, 25);
[gradientLayer setStartPoint:CGPointMake(0.0, 0.0)];
[gradientLayer setEndPoint:CGPointMake(0.0, 1.0)];
gradientLayer.colors = @[(id)[UIColor redColor].CGColor, (id)[UIColor
yellowColor].CGColor,(id)[UIColor blueColor].CGColor];
UILabel *label = [[UILabel alloc] initWithFrame:gradientLayer.bounds];
label.text = @"红黄蓝渐变~~";
label.font = [UIFont boldSystemFontOfSize:25];
label.backgroundColor = [UIColor clearColor];
[self.view addSubview:label];
[self.view.layer addSublayer:gradientLayer];
gradientLayer.mask = label.layer;
渐变颜色
7.NSNumber是一种什么设计模式
NSNumber内部是通过Tagged Pointer
存储的。
-
Tagged Pointer
专门用来存储小的对象,列入NSNumber
和NSDate
. -
Tagged Pointer
指针的值不再是地址了,而是真正的值。所以,实际上它不再是一个对象了,它只是一个披着对象皮的普通变量而已!所以,它的内存并不存储在堆中,也不需要malloc和free。
iOS SDK中使用抽象工厂方法的例子是NSNumber
8.请实现求根公式
int main()
{
my_sqrt(2);
return 0;
}
float my_sqrt(float val)
{
}
//输入 2
//输出 1.414
- 二分法
这种是最简单的,就是定义一个最小值0和最大值number,把一个数取一个中间值(0+number)/2,然后平方,如果平方大于该数值,就把中间值赋给最大值,否者就把中间值赋给最小值,一直循环,直到取到想要的精度为止。
double sqrt1(double x){
double EPSINON = 0.00001;
double low = 0.0;
double high = x;
double mid = (low + high) / 2;
while ((high - low) > EPSINON){
if (mid*mid > x){
high = mid;
}
else{
low = mid;
}
mid = (high + low) / 2;
}
return mid;
}
网友评论