21.在什么情况下会⽤用到weak这个关键字,作⽤用是什么?
1)在ARC中,在有可能出现循环引⽤用的时候,往往要通过让其中⼀一端使⽤用
weak来解决,⽐比如:delegate代理属性
2)⾃自⾝身已经对它进⾏行⼀一次强引⽤用,没有必要再强引⽤用⼀一次,此时也会使⽤用
weak,⾃自定义IBOutlet控件属性⼀一般也使⽤用weak;当然,也可以使⽤用
strong。
作⽤用: 弱引⽤用,引⽤用技术不会加1,在原对象没有任何强引⽤用的时候,弱指针会
被置为nil
22.什么是AVPlayerItem
⼀一个AVPlayerItem可以达标了⼀一个AVPlayer的⾥里的⼀一个对象,这个对象
包含了这个多媒体的所有资源的呈现状态,且可以观察到他们的状态变化。
(例如缓冲成功、失败、状态未知)
⼀一个AVPlayerItem对象执⾏行了对⼀一个AVAsset对象的引⽤用,同时呈现了
AVAsset资源的⼀一个集合,包括了跟踪启⽤用状态。如果你需要观察多媒体
资源本⾝身,你需要发送这个AVAsset对象。
AVPlayerItem对象其实像我们的tableview⼀一样,然后我们的cell⾥里⾯面包
含了很多的控件,这些控件都是我们cell的⼀一些资源,我们的AVAsset就
相当于是这个cell,⾥里⾯面包含了多媒体的各种信息和资源,然后我们可以
将AVAsset给呈现在我们的AVPlayerItem当中。 cell也是同理的,将控
件集合到我们的cell⾥里⾯面去,⽤用我们的tableview来呈现出来。
你在初始化⼀一个AVPlayer对象来播放多媒体项⺫⽬目的时候,需要使⽤用⼀一个
URL,我们有两种播放多媒体的⽅方法
23.推送是如何完成的?
参考推送原理⽂文档
24.__block和__weak的区别
关于__block:
1.__block对象在block中是可以被修改、重新赋值的。
2.__block对象在block中不会被block强引⽤用⼀一次,从⽽而不会出现循环引
⽤用问题。
关于__weak:
使⽤用了__weak修饰符的对象,作⽤用等同于定义为weak的property。⾃自
然不会导致循环引⽤用问题,因为苹果⽂文档已经说的很清楚,当原对象没有
任何强引⽤用的时候,弱引⽤用指针也会被设置为nil。
因此,__block和__weak修饰符的区别其实是挺明显的:
1.__block不管是ARC还是MRC模式下都可以使⽤用,可以修饰对象,还可
以修饰基本数据类型。
2.__weak只能在ARC模式下使⽤用,也只能修饰对象(NSString),不能
修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
25.如何解决tableview卡顿的问题?
1.使⽤用不透明视图
不透明的视图可以极⼤大地提⾼高渲染的速度。因此如⾮非必要,可以讲
tableView cell及其⼦子视图的opaque属性设置为YES(默认值)。
其中的特例包括背景⾊色,他的aplha值应该为1(例如不要使⽤用
clearColor);
图像的alpha值也应该为1,或者在画图时设置为不透明
2.不要重复创建不必要的tableView cell
tableViewCell的重⽤用机制。
3.减少视图的数⺫⽬目
UITableViewCell包含了textLabel、detailTextLabel和imageView等
view,⽽而你还可以⾃自定义⼀一些视图放在它的contentView⾥里。然⽽而view
是很⼤大的对象,创建它会消耗较多资源,并且也影响渲染的性能。
如果你的table cell包含图⽚片,且数⺫⽬目较多,使⽤用默认的UITableViewCell
会⾮非常影响性能。奇怪的是,使⽤用⾃自定义的view,⽽而⾮非预定义的view,
明显会快些。
当然,最佳的解决办法还是继承UITableViewCell,并在其drawRect:中
⾃自⾏行绘制:
- (void)drawRect:(CGRect)rect { if (image) { [image
drawAtPoint:imagePoint]; self.image = nil; } else { [placeHolder
drawAtPoint:imagePoint]; } [text drawInRect:textRect withFont:font
lineBreakMode:UILineBreakModeTailTruncation]; }
不过这样⼀一来,你会发现选中⼀一⾏行后,这个cell就变蓝了,其中的内容就
被挡住了。最简单的⽅方法就是将cell的selectionStyle属性设为
UITableViewCellSelectionStyleNone,这样就不会被⾼高亮了。
此 外还可以创建CALayer,将内容绘制到layer上,然后对cell的
contentView.layer调⽤用addSublayer:⽅方法。这个例 ⼦子中,layer并不会
显著影响性能,但如果layer透明,或者有圆⾓角、变形等效果,就会影响
到绘制速度了。解决办法可参⻅见后⾯面的预渲染图像
4.不要做多余的绘制⼯工作
在实现drawRect:的时候,它的rect参数就是需要绘制的区域,这个区域
之外的不需要进⾏行绘制。
例如上例中,就可以⽤用CGRectIntersectsRect、CGRectIntersection
或CGRectContainsRect判断是否需要绘制image和text,然后再调⽤用
绘制⽅方法
5.预渲染图像
在bitmap context⾥里先将其画⼀一遍,导出成UIImage对象,然后再绘制
到屏幕,详细做法可参考
http://www.keakon.net/ 2011/07/26/%E5%88%A9%E7%94%A8%E9%A2%84%E6%B8%B2%E6%9
F%93%E5%8A%A0%E9%80%9FiOS%E8%AE%BE%E5%A4%87%E7%9A
%84%E5%9B%BE%E5%83%8F%E6%98%BE%E7%A4%BA
6.不要阻塞主线程
使⽤用多线程,让⼦子线程去执⾏行这些函数或⽅方法
26.为UIImageView添加圆⾓角的⽅方法有哪些?
1.使⽤用layer
例如UIImageView *imageView;

imageView.layer.cornerRadius = cornerView.frame.size.height / 2; 

 imageView.layer.masksToBounds = YES;


masksToBounds防⽌止⼦子元素溢出⽗父视图。
2.绘制imageView
对image进⾏行裁剪,将image裁剪为圆形。

-(UIImage*) circleImage:(UIImage*) image withParam:(CGFloat) 

 inset { 

 UIGraphicsBeginImageContext(image.size); 

 CGContextRef context = UIGraphicsGetCurrentContext(); 

 CGContextSetLineWidth(context, 2); 

 CGContextSetStrokeColorWithColor(context, [UIColor 

 redColor].CGColor); 

 CGRect rect = CGRectMake(inset, inset, image.size.width - inset 

 * 2.0f, image.size.height - inset * 2.0f); 

 CGContextAddEllipseInRect(context, rect); 

 CGContextClip(context); 

 [image drawInRect:rect]; 

 CGContextAddEllipseInRect(context, rect); 

 CGContextStrokePath(context); 

 UIImage *newimg = 

 UIGraphicsGetImageFromCurrentImageContext(); 

 UIGraphicsEndImageContext(); 

 return newimg; 

 }


27.category,可以添加属性吗?(⽐比如NSString),如果不
可以,怎么解决?
在Category中本⾝身不允许为已有的类添加新的属性或者成员变量,可以使
⽤用Runtime运⾏行时来实现,使⽤用runtime.h中的
objc_getAssociatedObject和objc_setAssociatedObject来访问和⽣生
成关联对象。例如为NSObject添加⼀一个类⺫⽬目,分类中添加⼀一个属性
28.cell重⽤用原理,重⽤用有什么缺点
假设我们的屏幕上有10个cell,当我们第⼀一次显⽰示的时候这10个cell是创
建出来的,并且为其添加唯⼀一标识符,这个唯⼀一标⽰示符是来标识我们的
cell,相当于给它添加了⼀一个标签,命名,当我们往上滑动的时候,第11
个cell出现,这个cell也是重新创建出来的,我们在第11个cell出现前系
统默认查找了我们的“重⽤用池”,在这个重⽤用池当中遍历搜索看是否有已
存在的cell,这个重⽤用池是⼀一个集合,乱序的,当我们往上拉的时候系统
发现我们的重⽤用池当中并没有可以拿来使⽤用的cell,那便去创建⼀一个新的
cell,为其添加⼀一个唯⼀一标识符,我们继续往上拉,直到第⼀一个cell完全
从屏幕中消失,回到了我们的重⽤用池当中时,我们再往上拉,系统⼜又回到
重⽤用池去查找的时候发现我们重⽤用池当中有⼀一个带有唯⼀一标识符(我们设
定的)的cell时,便将这个cell给拿出来展⽰示在我们的⻚页⾯面当中,循环执
⾏行此⼯工作机制,我们再往后的每⼀一个cell都会是这样。
我们在使⽤用cell重⽤用的时候会经常性出现⼀一个问题,那边是cell重⽤用,数
据也重复,这种情况分为多种,model可以添加⼀一个唯⼀一标识,可以为
Model添加⼀一个BOOL类型的⼀一个属性,在我们滑动出来当前的cell时,
为其model的BOOL值设置为YES,来进⾏行判断即可。
29.版本更新迭代中coreData如何实现数据更新迭代
参考coreData⽂文档
30.OC可以实现多个接⼝口吗?重写⼀一个类的⽅方式⽤用继承好还
是分类好,为什么。
可以实现多个接⼝口,通过实现多个接⼝口可以完成C++的多重继承;
Category是类别,⼀一般情况⽤用分类好,⽤用Category去重写类的⽅方法,
仅对本Category有效,不会影响到其他类与原有类的关系。