标签:ios面试
1. 描述应用程序的启动顺序。
1)程序入口main函数创建UIApplication实例和UIApplication代理实例。
2) 在UIApplication代理实例中重写启动方法,设置根ViewController。
3) 在根ViewController中添加控件,实现应用程序界面。
2.为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
避免循环引用
这里delegate我们只是想得到实现了它delegate方法的对象,然后拿到这个对象的指针就可以了,我们不期望去改变它或者做别的什么操作,所以我们只要用assign拿到它的指针就可以了。
而用retain的话,计数器加1。我们有可能在别的地方期望释放掉delegate这个对象,然后通过一些判断比如说它是否已经被释放,做一些操作。但是实际上它retainCount还是1,没有被释放掉,
两者相互持有.RC永远不会变成0;dealloc不会执行,两者都不会释放.
(一个对象没必要管理自己delegate的生命周期,或者说没必要拥有该对象,所以我们只要知道它的指针就可以了,用指针找到对象去调用方法)
3.使用UITableView时候必须要实现的几种方法?
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
4.写一个便利构造器。
- (id)initWithName(NSString *)name age(int)age sex(NSString *)sex { self = [super init]; if (self){ _name = name; _age = age; _sex = sex; } return self; } + (id)initWithName(NSString *)name age(int)age sex(NSString *)sex { Person *p = [[Person alloc]initWithName:name age:age sex:sex]; return [p autorelease]; }
5. UIImage初始化一张图片有几种方法?简述各自的优缺点
imageNamed:系统会先检查系统缓存中是否有该名字的Image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。
imageWithCGImage:scale:orientation 当scale=1的时候图像为原始大小,orientation制定绘制图像的方向。
imageWithData;
6.回答person的retainCount值,并解释为什么
Person * per = [[Person alloc] init];
self.person = per;
RC= 2;
per.retainCount = 1 ,
set方法调用retain
setter方法引用计数再+1
7. 这段代码有什么问题吗:
@implementation Person
- (void)setAge:(int)newAge {
self.age = newAge;
}
@end
self.age在左边也是相当于setter方法,这就导致了死循环
8. 这段代码有什么问题,如何修改
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++) {
@autoreleasePool{NSString *string = @"Abc";
string = [string lowercaseString];
string = [string stringByAppendingString:@"xyz"];
NSLog(@"%@", string);
}
}
内存泄露.方法自带的自动释放池来不及释放.
在for循环中,自己添加内存池,产生一个释放一个
9.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们。
NSString *str = @"20|http://www.baidu.com";
NSArray *arr=[str componentsSeparatedByString:@"|"];
NSLog(@"%@%@",[arr objectAtIndex:0], [arr objectAtIndex:1]);
10. 用obj-c写一个冒泡排序
NSMutableArray *array = [NSMutableArray arrayWithObjects:@"25",@"12",@"15",@"8",@"10", nil]; for (int i = 0; i < array.count - 1; i++) { int a = [array[i] intValue]; for (int j = i + 1; j < array.count; j++) { int b = [array[j] intValue]; if (a < b) { [array exchangeObjectAtIndex:i withObjectAtIndex:j]; } } } for (int i = 0; i < array.count; i++) { NSLog(@"%@",array[i]); }
本文出自 “阿成的博客” 博客,请务必保留此出处http://fanyuecheng.blog.51cto.com/9529438/1686164
标签:ios面试
原文地址:http://fanyuecheng.blog.51cto.com/9529438/1686164