一、简答题
1、下面这些方法的方法名是什么?
1
2
3
4
|
-(
void
)person
-(
void
)personWithAge;
-(
void
)personWithAge:(
int
)age;
-(
void
)personWithAge:(
int
)age name:(
NSString
*)name;
|
答:person / personWithAge / personWithAge: / personWithAge: name:
2、NSArray和NSSet有什么使用区别?
(1)NSArray是有序的,而NSSet是无序的。
(2)NSArray数据可以相同,但是NSSet数据是不相同的。
(3)在搜索一个一个元素时NSSet的效率比NSArray高,因为NSSet用到了一个算法hash。比如你要存储和访问一个数据元素A,一个hash算法直接就能找到A的应该存储的位置和存储位置。而NSArray则需要遍历整个数组。
3、定义一个无参返回值的block变量,并且调用这个block?
//没有返回值,没有参数的block
1
2
3
4
5
6
7
|
-(
void
)blockWithoutParameterAndReturnData
{
void
(^myBlock)(
void
) = ^ {
NSLog
(@
"This is a block without parameter and returned value"
);
};
myBlock();
}
|
4、定义一个有参有返回值的block变量,并且调用这个block?
1
2
3
4
5
6
7
8
|
-(
void
)AddParameterAndRestunValuesForBlock
{
int
(^blocknames)(
int
) = ^(
int
num) {
return
num * 30;
};
int
result = blocknames(2);
NSLog
(@
"%d"
,result);
}
|
5、你知道Swift是什么么?谈谈对它目前的了解?
Swift是苹果新出的一个开发语言,它是基于C语言开发的,比Objective-C更加灵活方便。在不久的将来Swift会取代Objective-C作为iOS开发的主要语言。
6、强引用和弱引用的区别?
强引用是持有对象,弱引用是不持有对象;
强引用可以释放对象,但是弱引用不可以,当一个对象为强引用时,在其作用域之外的话,该对象所持有的对象被释放;当一个对象为弱引用时,,它不持有对象,在对象释放后,它自动被赋值为nil。
7、strong、weak、assign各自使用的场合是什么?
assign用于简单数据类型,如NSInteger,double,bool.
在ARC环境下,strong代替retain,weak代替assign;
在循环使用的时候,一端用strong,另一端则需要使用weak,防止循环调用。
OC对象类型一般都是用strong.
8、分类(Category)有什么作用
- 将类的实现分散到多个不同文件或者多个不同框架中。
- 创建对私有方法的向前引用。
- 向对象添加非正式协议。
简单来说就是:Category可以对类进行扩展,可以给所有类添加自己的方法。
9、谈谈你对self和super的理解?
在我的世界观里,self就是一个类的隐藏的参数,指向当前调用方法的类;
而super指的是父类。使用super就会告诉编译器,要去调用父类的方法。super只是一个编译指示符。
10、编译器遇到下面的代码会自动生成哪些代码?
1
2
3
4
|
self
.age = 20; 自动生成[set stAge:20];
int
age =
self
.age;
//有待完善
NSArray
*names = @[@“mj”,@”jj”,@“jay”];
// NSArray *names = [[NSArray alloc] initWithObjects:@"mj",@"jj",@"jay", nil];
id
money =
@20
; 自动生成:
NSNumber
*money1 = [[
NSNumber
alloc] initWithInt:20];
|
二、编程题
11、用两种不同的思路编写函数来计算下面的式子:
1+2+3+4+。。。。。+n(n>=1)(PS:一共要写两个函数,仅仅再for/while/do之间更换不算新的思路)
思路一:
1
2
3
4
5
6
7
|
- (
NSInteger
)addToN1:(
NSInteger
)n {
NSInteger
total = 0;
for
(
int
i=1;i<=n;i++) {
total +=i;
}
return
total;
}
|
思路二、
1
2
3
4
5
|
- (
NSInteger
)addToN2:(
NSInteger
)n {
NSInteger
total = 0;
total = n*(n+1)/2;
return
total;
}
|
12、使用Category给某类(哪个类自己思考)增加一个方法,用来完成以下功能:假设一个OC可变数组存放着很多整数字符串,比如@“10”、@“20”.要求调用完这个方法之后,这个数组里面的数字字符是升序排列的,(从小到大排列)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
NSMutableArray
+Additions.h
//
// NSMutableArray+Additions.h
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface
NSMutableArray
(Additions)
+(
NSMutableArray
*)sortValues:(
NSMutableArray
*)mutableArray;
@end
NSMutableArray
+Additions.m
//
// NSMutableArray+Additions.m
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "NSMutableArray+Additions.h"
@implementation
NSMutableArray
(Additions)
+(
NSMutableArray
*)sortValues:(
NSMutableArray
*)mutableArray
{
NSComparator
finderSort = ^(
id
string1,
id
string2) {
if
([string1 integerValue]>[string2 integerValue]) {
return
(
NSComparisonResult
)
NSOrderedDescending
;
}
else
if
([string1 integerValue]<[string2 integerValue])
{
return
(
NSComparisonResult
)
NSOrderedAscending
;
}
else
{
return
(
NSComparisonResult
)
NSOrderedSame
;
}
};
NSMutableArray
*arr= [[
NSMutableArray
alloc] initWithCapacity:[mutableArray count]];
NSArray
*sortedArr = [mutableArray sortedArrayUsingComparator:finderSort];
for
(
int
i=0;i<[mutableArray count];i++) {
[arr addObject:[sortedArr objectAtIndex:i]];
}
return
arr;
}
@end
测试方法:
- (
void
)viewDidLoad {
[
super
viewDidLoad];
NSMutableArray
*mutableArray = [[
NSMutableArray
alloc] initWithObjects:@
"5"
,@
"20"
,@
"3"
,@
"60"
,@
"50"
,
nil
];
NSLog
(@
"%@"
,[
NSMutableArray
sortValues:mutableArray]);
}
13、使用Category给所有OC对象增加一个run方法(对象方法),然后在run方法中
NSLog
打印对象本身:
NSObject
+Additions.h
//
// NSObject+Additions.h
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface
NSObject
(Additions)
-(
void
)run;
@end
NSObject
+Additions.m
//
// NSObject+Additions.m
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "NSObject+Additions.h"
@implementation
NSObject
(Additions)
-(
void
)run
{
NSLog
(@
"%@"
,
self
);
}
@end
|
14、使用Category给NSString类增加以下功能(需要用到的方法自己查资料或者猜)
- 计算英文字母的个数(比如@“235432534rre4645eer”,调用方法之后返回6)
- 字符串反转(比如@“abc”,调用后输出@“cba”)
- 去除字符串两端空格(比如@“ jack roce ”,调用后返回@“jack rose”)
- 截取网站域名中的www.和.com之间的字符串(比如@“http://www.baidu.com”,输出baidu)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
NSString
+Additions.h
//
// NSString+Additions.h
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface
NSString
(Additions)
/**判断NSString中含有的字母个数*/
-(
NSInteger
)getNumberOfLetterInString;
/**反转字符串*/
-(
NSString
*)reversalString;
//删除开始和结束的字符串
-(
NSString
*)deleteBackAndForwardBlank;
//得到域名
-(
NSString
*)getDominFromWebLink;
@end
NSString
+Additions.m
//
// NSString+Additions.m
// MianShiDemo
//
// Created by zhanggui on 15/7/19.
// Copyright (c) 2015年 zhanggui. All rights reserved.
//
#import "NSString+Additions.h"
@implementation
NSString
(Additions)
-(
NSInteger
)getNumberOfLetterInString
{
NSInteger
strLength =
self
.length;
int
result = (
int
)strLength;
for
(
int
i=0;i<strLength;i++) {
char
c = [
self
characterAtIndex:i];
if
(c>=
'0'
&& c<=
'9'
) {
//判断是不是数字
result = result-1;
NSLog
(@
"数字有:%c"
,c);
}
}
return
result;
}
-(
NSString
*)reversalString
{
NSMutableString
*s = [
NSMutableString
string];
NSUInteger
length =
self
.length;
for
(
NSUInteger
i=length;i>0;i--) {
[s appendString:[
self
substringWithRange:
NSMakeRange
(i-1, 1)]];
}
return
s;
}
-(
NSString
*)deleteBackAndForwardBlank
{
NSString
*trimmedString = [
self
stringByTrimmingCharactersInSet:[
NSCharacterSet
whitespaceAndNewlineCharacterSet]];
return
trimmedString;
}
-(
NSString
*)getDominFromWebLink
{
NSString
*tempString = [
NSString
string];
NSRange
wwwRange = [
self
rangeOfString:@
"www."
];
NSRange
comRange = [
self
rangeOfString:@
".com"
];
NSRange
needRange =
NSMakeRange
(wwwRange.length+wwwRange.location, comRange.location-wwwRange.location-wwwRange.length);
tempString = [
self
substringWithRange:needRange];
return
tempString;
}
@end
|
15、定义一个书本类,需要有名字、价格、出版年份(比如2014年)三个成员属性,创建5个书本对象,属性可以任意值,但名字不要使用中文
- 增加一个便利构造方法(工厂方法),用于快速创建对象
- 使用NSLog直接输出书本对象时,要保证输出字符串格式为:这本书叫做xx,价格是xx,出版年份是xx
- 对5本书本对象按照出版年份—》价格—》名字优先级从小到大排序(出版年份相同按照价格排序,价格相同按照名字排序)