知否问答

iOS程序员面试题精选
2017-06-01
  • 详情 题目总数 80
1.不会立刻使引用计数器改变的是
  • release
  • alloc1
  • autorelease
  • retai
2.在OC中类的接口声明关键字为
  • @import
  • @interface
  • @implementio
  • @protocol
3.NSString *name = [[NSString alloc]initWithString:@"张三"];
NSLog(@"%d",[name retainCount]);
上述代码打印结果是
  • -1
  • 1
  • 2
4.下列选项中全部属于对象的是
  • 我的白色iPhone4s;Mac Mini
  • 狗;老虎
  • 邻居家的猫咪“贝贝”;我的弟弟“张三”
  • 保时捷;犀利哥
5.NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a value" forKey:@"aKey"];
NSLog(@"%@",[dict objectForKey:@"aKey"]);
[dict release];
控制台中打印的最后一条信息会是
  • a value
  • aKey : a value
  • 崩溃信息
  • a value : aKey
6.现有如下集合,能准确删除“张三”的代码是:NSMutableDictionary * peoples=[NSMutableDictionary dictionaryWithObjectsAndKeys:@"张三",@"左护法",@"李四",@"右使",@"唐sir",@"老大哥", nil];
  • [peoples removeObjectForKey:@"左护法"];
  • [peoples removeObject:@"张三"];
  • [peoples removeObjectAtIndex:0];
  • [peoples removeAllObjects];
7.关于类和对象的概念,下列属于对象的是
  • 奥迪A6
  • 保龄球
  • 世界冠军刘翔
  • 西红柿
8.以下说法不正确的是
  • nonatomic:提供多线程保护,提高性能,在没有使用多线程的编程中可以选择使用。
  • assign:属性默认值。说明设置器直接进行赋值,针对基础数据类型 (NSInteger,CGFloaA和C数据类型(int, float, double, char)等等。
  • retain:此属性只用于obj-c的对象类型,对参数进行release旧值,再retain新值。
  • copy:此属性只对实现NSCopying协议的对象有效(NSString)。拷贝工作由copy方法执行。
9.NSArray *array = [NSArray arrayWithObjects:@"1",@"2",@"3",@"4",@"2", nil];
NSMutableSet *set = [[NSMutableSet alloc]init];
for(NSString *str in array)
{
[set addObject:str];
}
NSLog(@"%lu",[set count]);
[set release];
控制台打印的结果是
  • 4
  • 5
  • 6
  • 7
10.经过下列哪种操作后需要使用release方法。
  • delegate
  • assig
  • retai
  • dealloc
11.声明一个方法:提供Student对象数组按照学号升序排列的判断条件
  • -(NSComparisonResult)compareWithNumberForAscendSort:(Student*)otherStudent
  • -(NSInteger)compareWithNumberForAscendSort:(Student*)otherStudent
  • - (BOOL))compareWithNumberForAscendSort:(Student*)otherStudent
  • +(int)compareWithNumberForAscendSort:(Student*)otherStudent
12.下列哪个选项不需要release方法
  • [[NSString alloc]init];
  • [[NSString alloc] initWithString:@”hehe”];
  • [[NSArray arrayWithArray: arr1];
  • [[NSMutableDictionary alloc] init];
13.OC中,所有类的根类是
  • NSObject
  • NSDate
  • NSCoding
  • UIView
14.下列哪个选项与@synthesize配合使用
  • @end
  • @interface
  • @implementatio
  • @property
15.向Xcode控制台输出一个字符串应该用
  • NSLog()
  • Printf()
  • NSPrintf()
  • scanf()
16.必须实现的协议方法使用:关键字声明
  • @property
  • @interface
  • @required
  • @protocol
17.NSMutableString * str = [[NSMutableString alloc] initWithFormat:@"123"];
NSLog(@"str = %p",str);
[str appendFormat:@"456"];
NSLog(@"str = %p",str);
上面代码对字符串str进行拼接后,2次打印的地址是否相同
  • 相同
  • 不同
  • 随机打印
  • 有时相同,有时不同
18.Objective-C的代码文件的后缀为
  • .cpp
  • .m
  • .pl
  • .c
19.下列说法中错误的是
  • Objective-C不用"函数调用",而用互相传递讯息.
  • Objective-C一个完整的类分为interface和implementation两块
  • Objective-C对象使用new分配内存,用delete释放
  • Objective-C协议分为非正式协议和正式协议
20.NSArray *array = [NSArray arrayWithObjects:@"one", @"two", @"three",nil];
NSLog(@"%@",[array objectAtIndex:1]);
NSLog(@"%@",[array objectAtIndex:3]);
控制台中打印的最后一条信息会是
  • one
  • two
  • three
  • 崩溃信息
21.OC中布尔(BOOL)类型的变量的值只有
  • 1/0
  • YES/NO
  • true/false
  • 1/-1
22.Objective-C中包含一个自定义的头文件应该使用
  • #include "
  • #include<>
  • #import "
  • #import<>
23.在OC中,类中成员变量的可见度(访问权限)不包括
  • @public
  • @protected
  • @private
  • @optional
24.OC中的委托最好声明成
  • retai
  • assig
  • copy
  • readonly
25.面向对象的特性不包括
  • 封装
  • 继承
  • 多态
  • 构造
26.OC中与alloc相反的方法是
  • release
  • retai
  • dealloc
  • free
27.用哪个关键字定义协议中必须实现的方法
  • @optional
  • @protected
  • @private
  • 不用写关键字
28.下面哪些选项是属性的正确声明方式
  • @property(nonatomic,retain)NSString myString;
  • @property(nonatomic,assign)NSString * myString;
  • @property(nonatomic,assign)int mynumber;
  • @property(nonatomic,retain)int mynumber;
29.对于Objective-C中的方括号“[]”的作用,下列说法错误的是
  • 用于通知某个对象该做什么
  • 方括号内第一项是对象,其余部分是你需要对象执行的操作
  • 在Objective-C中通知对象执行某种操作,称为发送消息.(也叫调用方法)
  • 方括号中可以为空
30.以下代码执行后,person对象的retain count是多少
Person * person = [[Person alloc] init];
[person retain];
[person release];
  • 1
  • 2
  • 3
31.创建对象时,对象的内存和指向对象的指针分别分配在哪里
  • 堆区,栈区
  • 常量区,堆区
  • 全局区,栈区
  • 栈区,堆区
32.协议与委托的描述不正确的是
  • 委托是iOS的一种设计模式
  • 协议里的方法默认是必须实现的
  • 类接受了多个协议,这些协议写在父类后面的<>内,多个协议之间用“、”隔开
  • 定义协议使用@protocol关键字
33.类何时调用dealloc方法
  • [property release]后
  • [instance release]后
  • [super dealloc]时
  • 当引用计数为0时.
34.NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
[formatter setAMSymbol:@"AM"];
[formatter setPMSymbol:@"PM"];
[formatter setDateFormat:@"YY-MM-dd hh:mm:ss aaa"];
NSString * currentDate = [formatter stringFromDate:[NSDate date]]; NSLog(@"%@",currentDate);
打印结果是
  • 2012-05-31 17:45:04 PM
  • 2012/5/31 17:45
  • 2012/5/31 17:45
  • 2012/5/31 17:45
35.NSRange的成员变量有
  • location,length
  • width,height
  • location,height
  • length,width
36.现有自定义类Student,下列选项中Student类的便利构造器编写正确的是
  • -(id) initWithName:(NSString *) newName{ Student * stu = [[Student alloc] init]; stu.Name= newName; return stu;}
  • +(id) studentWithName:(NSString *) newName{ Student * stu = [[Student alloc] init]; stu.Name= newName; return stu;}
  • +(id) studentWithName:(NSString *) newName{ Student * stu = [[Student alloc] init]; stu.Name= newName; [stu release]; return stu;}
  • +(id) studentWithName:(NSString *) newName{ Student * stu = [[Student alloc] init]; stu.Name= newName; [stu autorelease]; return stu;}
37.自定义一个Person类,下面哪个选项是规范的便利构造器声明方式
  • -(id)personWithName:(NSString *)theName;
  • -(id)personwithName:(NSString *)theName;
  • +(id)personwithName:(NSString *)theName;
  • +(id)personWithName:(NSString *)theName;
38.下列代码正确的输出结果是
NSString * urlStr = @" www.jianshu.com";
NSRange range = NSMakeRange(4,7);
NSString *prefix = [urlStr substringWithRange:range];
NSLog(@"%@",prefix);
  • .ji
  • jianshu
  • www.jia
  • jia
39.
在OC中扩展类的方法的形式不包括
  • 继承
  • 多态
  • 类目
  • 延展
40.
关于KVC的描述正确的是
  • KVC是指"Key-Value Observing"
  • 是一种间接访问对象的属性的机制。
  • 只能访问对象的属性。
  • 当对象的属性值改变时,我们能收到一个通知。
41.以下说法正确的是
  • 求数组的内容的个数用length方法
  • 字典是根据其位置来索引数据的
  • 协议中定义的方法默认是必须实现的
  • 定义类目必须要拿到自己类的源代码
42.简单类型的成员比如:int类型成员在使用@property()时,括号中应使用
  • assig
  • copy
  • retai
  • auto
43.下列代码:@property(nonatomic,assign)id<Painting>myObject;
  • 是说myObject是Painting分类的一部分
  • 是说myObject遵从于Painting分类
  • 是说myObject遵从于Painting协议 协议代理对象
  • 不是合法的Objective-C语法格式
44.内存管理的关键字描述错误的是
  • retaincount是指对象的引用计数。
  • retain关键字可以增大对象的引用计数。
  • release可以减小对象的引用计数,但autorelease不可以
  • dealloc方法不能直接调用
45.下面程序段的输出结果是什么
NSMutableArray * arr1 = [[NSMutableArray alloc] initWithObjects:@"1",@"2",@"3", nil];[arr1 addObject:@"0"];
[arr1 replaceObjectAtIndex:2 withObject:@"3"];
NSLog(@"%@",arr1);
  • 0,1,2,3
  • 1,2,3,0
  • 1,3,3,0
  • 0,3,2,3
46.下列有效的键路径是
  • [foo valueForKeyPath:@”1SomeMember”]
  • [foo valueForKeyPath:@”someMember.someAttribute”]
  • [foo valueForKeyPath:@”SOMEMEMBER@someAttibute”]
  • [foo valueForKeyPath:@”some Member”]
47.有一个类Student,要求实现:定义一个实例初始化方法,初始化方法需要传入名字和性别
  • -(id)initWithName:(NSString *)name sex:(NSString *)sex{ if (self){ self.name = name; self.sex = sex; } return self;}
  • -(id)initWithName:(NSString *)name sex:(NSString *)sex{ if (self = [super init]) { self.name = name; self.sex = sex; } return self;}
  • -(id)initWithName:(NSString *)name sex:(NSString *)sex{ if (!self) { self.name = name; self.sex = sex; } return self;}
  • -(id)initWithName:(NSString *)name sex:(NSString *)sex{ if (self = [super init]) { self.name = name; self.sex = sex; }}
48.下面哪个选项对集合的描述是正确的
  • 集合内不能存不同类型的对象
  • 集合内可以存整型的数
  • 字典内键值可以相同,但是每个键值对应的对象必须不同
  • 集合内只能存对象
49.NSString 和 NSMutableString的关系和区别描述不正确的是
  • NSString是不可变字符串,即本身内容不能被改变。
  • NSMutableString是可变字符串,即本身内容可修改。
  • NSMutableString是NSString的子类。
  • NSString和NSMutableString没有任何关系。
50.下面哪个选项无内存问题的
  • -(NSString *)description{ NSString * str = [[NSString alloc] initWithFormat:@"description"]; return str;}
  • -(NSString *)description{ NSString * str = [[NSString alloc] initWithFormat:@"description"]; [str release]; return str;}
  • -(NSString *)description{ NSString * str = [[NSString alloc] initWithFormat:@"description"]; [str autorelease]; return str;}
  • -(NSString *)description{ NSString * str = [NSString stringWithFormat:@"description"]; return [str autorelease];}
51.关于NSSet描述正确的有
  • NSSet可以存放任何数据类型的数据。
  • NSSet存放数据是无序的。
  • NSSet可以通过下标获取数据。
  • NSSet存放的数据是有序的。
52.下列哪个选项不能作为property的可选属性
  • alloc
  • retai
  • atomic
  • strong
53.NSRange是什么数据类型
  • 数组
  • 字典
  • 结构体
  • 指针
54.下面描述正确的选项是
  • 当计数器为1时,dealloc方法由系统自动调用
  • 一个对象在引用计数变为0时,会调用自己的dealloc方法
  • 在dealloc方法里,应该在[super dealloc]后释放本类所拥有的对象
  • 开启ARC后,可以重载dealloc,必须在dealloc里写 [super dealloc]方法
55.实例变量默认的访问修饰符是
  • @public
  • @private
  • @protected
  • @package
56.下面程序段的输出结果是什么
NSArray * arr1 = [[NSArray alloc] initWithObjects:@"1",@"2",@"3", nil];
NSString *str;
str = [arr1 objectAtIndex:2];
NSLog(@"%@",str);
  • 1
  • 2
  • 3
  • 程序崩溃
57.@interface Person : NSObject@property(nonatomic,retain)NSString * name;@end上面声明一个Person类
Person * per = [[Person alloc] init];
per.name = [[NSString alloc] initWithFormat:@"张三"];
NSLog(@" per.name = %d",[per.name retainCount]);
  • per.name = -1;
  • per.name = 0;
  • per.name = 1;
  • per.name = 2;
58.下面程序段的输出结果是什么
NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"2",@"3",@"3",@"4", nil];
[dic removeObjectForKey:@"3"];
NSLog(@"%@",dic);
  • 1=2 3=4
  • 1=2 2=3
  • 2=1 4=3
  • 2=1 3=2
59.关于协议描述不正确的是
  • 协议分正式和非正式协议。
  • 在要求确认协议的类必须实现协议中的方法时,可以使用@required。
  • 一个协议可以被多个类确认。
  • 协议中声明的方法,默认是@optional的。
60.下面哪个选项是正确的
  • 用继承可以扩展一个类,要调用扩展的方法,既可以用父类,也可以用子类
  • 用类目可以扩展一个类,可以直接用该类或该类的实例对象,去调用该类目扩展的方法
  • 延展就是类目
  • 可以在一个类的外部,调用这个类延展的方法
61.以下对类的描述不正确的是
  • 类的接口部分可以包含实例变量、属性和方法
  • 可以把声明和实现都放到.h文件中
  • 一对文件(Person.h Person.m)只能定义一个类
  • 类比较抽象,对象比较具体
62.声明一个返回值为NSArray,并且带两个字符串对象的BLOCK类型变量
  • NSArray (*aBlock)(NSString * str,NSString *str2)
  • NSArray ^(*aBlock)(NSString * str,NSString *str2)
  • NSArray (^aBlock)(NSString * str,NSString *str2)
  • NSArray *(^aBlock)(NSString * str,NSString *str2)
63.Objective-C 语言中类的实例变量如果只可以被本类和其子类访问,需要下列哪个修饰符
  • @public
  • @private
  • @protected
  • @friendly
64.关于类目、延展的描述错误的是
  • 延展主要为类提供“私有”方法
  • 类目、延展不但能为类添加方法,而且都可以添加新的实例变量
  • 无论能否拿到类的源码,类目都可以对其扩展
  • 类目和延展声明语法不同
65.现要求声明一个集合,并将字符串添加到集合中,编写了如下代码,其中错误的是第几行:NSString * aString = [[NSString alloc] initWithString:@"iLanou"];
(1)[aString autorelease];
(2)NSArray * arr = [NSArray array];
(3)[arr addObject:aString];
(4)NSLog(@"string = %lu",[aString retainCount]);
  • -1
  • -2
  • -3
  • -4
66.查看下列代码,能正确输出number的选项是
@interface MyClass : NSObject
{
int number;
}
+(void) printNumber;
@end
@implementation MyClass
+(void) printNumbe
{
umber =10;
NSLog(@"%d",number);
}
@end
  • [MyClass printNumber];
  • MyClass * obj = [[MyClass alloc] init]; [obj printNumber];
  • printNumber();
  • 编译错误,无法执行。
67.读代码
NSString * str =[[NSString alloc]initWithFormat:@"%@",@"iLanou123ios"];
NSString * str1=[str substringToIndex:3];
NSString * str2=[str substringWithRange:NSMakeRange(6, 3)];
NSString * newStr=[str1 stringByAppendingString:str2];
NSLog(@"newStr=%@",newStr);
则newStr的值为
  • iLanou
  • iL123
  • iLaios
  • iLa123
68.对于下面代码说法正确的是
@property (copy,nonatomic,readonly)NSString * calValue;
  • 没有getter方法,当对calvalue赋值时,将产生一个NSString副本。
  • 此属性可保证多线程安全。
  • 此属性在合成时可以生成设置器方法。
  • 此属性只能读取,不能赋值。
69.NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"2",@"3",@"3",@"4", nil];
NSArray *arr = [[NSArray alloc] initWithArray:[dic allKeys]];
NSString *str = [[NSString alloc] initWithFormat:[arr objectAtIndex:0],[arr objectAtIndex:1],[arr objectAtIndex:2]];
NSLog(@"%@",str);
结果是
  • 123
  • 234
  • 2
  • 3
70.下面程序段的输出结果是什么
NSString * aString = [[NSString alloc] initWithFormat:@"123"];  NSLog(@"%d",aString.retainCount);
aString = @"456";
NSLog(@"%d",aString.retainCount);
[aString release];
aString = @"789";
NSLog(@"%d",aString.retainCount);
  • 1,2,1
  • 1,1,0
  • 1,-1,0
  • 1,-1,-1
71.下面程序段的输出结果是什么
NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"2",@"3",@"3",@"4", nil];
NSString *str = @"3";int a = 3;[dic setObject:a forKey:str];
NSLog(@"%@",dic);
  • 2=1 3=3 4=3
  • 1=2 3=3 3=4
  • 1=2 3=3 3=3
  • 程序崩溃
72.写出下面程序段的输出结果
NSString * aString = [[NSString alloc] initWithString:@"123"];
[aString autorelease];
NSMutableArray * arr = [NSMutableArray array];
[arr addObject:aString];
NSLog(@"string = %lu",[aString retainCount]);
  • 1
  • 整型最大值
  • 2
73.NSMutableDictionary字典中删除对象可以使用下面那个方法
  • filteredArrayUsingPredicate
  • arrayByAddingObject
  • initWithCapacity
  • setValue:forKey
74.有如下一个类定义
@interface MyClass:NSObject
@property(nonatomic,retain)NSString *str;
@end
@implementation MyClass
(1)-(NSString *)str{  return str;}
-(void)dealloc{  self.str = nil;
[super dealloc];}
@end
(1)处补充完整
  • -(void)setStr:(NSString *)newStr{ str = newStr;}
  • -(void)setStr:(NSString *)newStr{ [str release]; str = [newStr retain];}
  • -(void)setStr:(NSString *)newStr{ if(str != newStr) { [str release]; str = [newStr retain]; }}
  • -(void)setStr:(NSString *)newStr{ [newStr retain] [str release] = newStr;}
75.下列哪个操作不会引起引用计数(retaincounA的变化是
  • NSString *str1 = [[NSString stringWithFormat:@"hehe"];
  • int a=1;
  • NSMutableData *data1 = [NSMutableData allocWithZone:data2];
  • NSArray *arr1 = [[NSArray alloc]initWithArray:arr2];
76.下面程序段的输出结果是什么
NSString * aString = [[NSString alloc] initWithString:@"hehe"];
[aString autorelease];
NSMutableArray *arr = [NSMutableArray array];
[arr addObject:aString];
NSLog(@"string = %d",[aString retainCount]);
  • string = -1
  • string = 0
  • string = 1
  • string = 2
77.下面程序段的输出结果是什么
NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"1",@"3",@"1",@"4", nil];
NSArray *arr1 = [[NSArray alloc] initWithArray:[dic allKeys]];
NSArray *arr2 = [[NSArray alloc] initWithArray:[dic allValues]];
NSMutableDictionary *dic2 = [[NSMutableDictionary alloc] initWithObjects:arr1 forKeys:arr2];
NSLog(@"%@",dic2);
  • 1=2 1=3 1=4
  • 2=1 3=1 4=1
  • 1=4
  • 4=1
78.下面程序段的输出结果是什么
int a = 10;
NSNumber *b = [[NSNumber alloc] initWithInt:a];
NSLog(@"%d", a+++b);
  • 21
  • 20
  • 30
  • 编译错误
79.下面程序段的输出结果是什么
NSMutableDictionary * dic = [[NSMutableDictionary alloc] initWithObjectsAndKeys:@"1",@"2",@"2",@"3",@"3",@"4", nil];
[dic setObject:@"1" forKey:@"3"];
[dic removeObjectForKey:@"1"];
NSLog(@"%@",dic);
  • 1=3 2=3 3=4
  • 1=2 1=3 3=4
  • 2=1 3=1 4=3
  • 3=1 3=2 4=3
80.下列选项中不能正常为emp的name属性赋值的代码有
  • emp.name=@"李嘉诚";
  • emp->name=@"李开复";
  • [emp setValue:@"柳传志" forKey:@"name"];
  • [emp setName:@"黄光裕"];