您的位置:首页 > 职场人生

面试 (一) : iOS基础篇-3(100题21~40)

2017-04-11 00:00 621 查看
#####22.为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?

1
防止循环引用.

如:对象A引用了对象B,对象B引用了对象C,对象C引用了对象B,这个时候B的引用计数是2,而C的引用计数是1,当A不再使用B的时候,就释放了B的所有权,这个时候C还引用对象B,所以B不会释放,引用计数为1,因为B也引用着对象C,B不释放,那么C也就不会被释放,所以他们的引用计数都为1,并且永远不会被释放,形成了循环引用.

#####23.使用UITableView的时候必须要实现的几种方法?

1
2个数据源方法.分别是:
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

#####24.写一个遍历构造器.

+(id)leftModelWith{
leftModel * model = [self alloc]init];
return model;
}


#####25.UIImage初始化一张图片有几种方法?简述其特点?

1
3种,

imageNamed:系统会先检查系统缓存中是否有该名字的image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回.

initWithContentsOfFile:系统不会检查缓存,而直接从文件系统中记载并返回.

imageWithCGImage:scale:orientation 当scale= 1的时候图像为原始大小,orientation指定绘制图像的方向.

#####26.person的retainCount值,并解释为什么?

1
Person * per = [Person alloc]init];
self.person = per;

答:
1或者2.看person是什么类型修饰的.
alloc+1,assign+0,retain+1.

#####27.下面这段代码有何问题?

1
@implementation Person
-(void)setAge:(int)newAge {
self.age = newAge;
}
@end
答:
死循环

#####28.这段代码有什么问题,如何修改

1

for (int i = 0; i < someLargeNumber; i++) {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}

加入自动释放池@autoreleasepool{};
for (int i = 0; i < someLargeNumber; i++) {
@antoreleasepool {
NSString *string = @”Abc”;
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@“%@”, string);
}
}


#####29.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们。

1
["20 | http://www.baidu.com" componentSeparatedByString:@"|"];

#####30.用obj-c 写一个冒泡排序.

NSMutableArray *ary = [@[@"1", @"2", @"3", @"4", @"6", @"5"] mutableCopy];
for (int i = 0; i < ary.count - 1; i++) {
for (int j = 0; j < ary.count - i - 1; j++) {
if ([ary[j] integerValue] < [ary[j + 1] integerValue]) {
[ary exchangeObjectAtIndex:j withObjectAtIndex:j + 1];// //交换
}
}
}
NSLog(@"%@", ary);


#####31.简述对UIView.UIWindow和CALayer的理解.

1
UIWindow是应用的窗口,继承于UIResponder.

UIView继承于UIView,是创建窗口中的一个视图,可以响应交互事件.一个程序只有一个主window,可以有多个window.

CALayer图层,一个view可有多个图层,不可以响应事件.

#####32.写一个完整的代理,包括声明,实现.

代理:遵守协议的对象.
@class MyView;
第一步:指定协议:(协议名:类名+Delegate)
@protocol MyViewDelegate <NSObject>
@required
-(void)changeViewBackgroudColor:(MyView *)view;
@optional
-(void)test;
@end

@interface MyView : UIView
第二步:指定代理
@property (nonatomic,assign)id<MyView> delegate;
@end

第三步:代理遵循协议.
第四步:代理实现协议里面的必须实现的方法和其他可选方法.
第五步:委托方通知代理开始执行方法.


#####33.分析json.xml的区别,底层如何实现?

1
Json:键值对.数据小,不复杂.便于解析,有框架支持,适合轻量级传输.作为数据包个数传输的时候效率更高.

xml:标签套内容.xml数据两较大,比较复杂.适合大数据量的传输.xml有丰富的编码工具,比如:Dom4j,JDom.解析方式有两种,一是通过文芳模型解析,另外一种遍历节点.

#####34.ViewController的didReceiveMemoryWarning是在什么时候被调用的?

1
1.当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向所有ViewController发送内存警告.
2.打开系统相机.
3.加载高清图片.
默认操作:把里面没有用的对象进行释放.

#####35.面向对象的三大特征,简单介绍.

1
封装:代码模块化,方便以后调用.
继承:子类继承父类的所有方法和属性.
多态:父类指针指向子类对象.

#####36.重写一个NSString类型的,retain方式声明name属性的setter和getter方法.

1
属性的三大特性:语义特性,原子特性,读写特性.
同时重写setter和getter方法,@synchronized name = _name,关联属性和实例变量. // 我感觉是 @synthesize name = _name;

-(void)setName:(NSString *)name{
if(_name != name){
[_name retain];
[_name release];
_name = name;
}
}
-(NSString *)name{
return [[_name retain]autorelease];
}

#####37.简述NotificationCenter.KVC,KVO,Delegate?并说明它们之间的区别?

1
NotificationCenter:消息中心.消息通知.

KVC:利用键-值间接访问类中的某个属性.
[self setValue:@"123" forKeyPath:@"name"];
NSLog(@"%@",[self valueForKeyPath:@"name"]);

KVO:利用键-路径间接访问类中的某个属性,也就是观察者模式(KVO+通知中心).基于KVC和通知中心,观察的是实例变量.

Delegate:用于多个类之间的传值.

#####38.What is lazy loading?

1
懒加载

#####39.对MVC的理解,好处?

1
MVC:是一种架构.model:数据处理,view:视图显示,controller:逻辑控制,负责视图和模型之间的通信.
高聚合,低耦合,提高代码的复用性.

#####40.监测键盘的弹出.

1
通知.
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector() name:UIKeyboardWillShowNotification object:nil];
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS 面试基础篇