iOS基础面试题一

一、简答题
1、下面这些方法的方法名是什么?
-(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
-(void)blockWithoutParameterAndReturnData
{
    void(^myBlock)(void)  = ^ {
        NSLog(@"This is a block without parameter and returned value");
    };
    myBlock();
}
4、定义一个有参有返回值的block变量,并且调用这个block?
      -(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、编译器遇到下面的代码会自动生成哪些代码?
  
   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之间更换不算新的思路)
     思路一:
- (NSInteger)addToN1:(NSInteger)n {
    NSInteger total = 0;
    for(int i=1;i<=n;i++) {
        total +=i;
    }
    return total;
}
思路二、
  - (NSInteger)addToN2:(NSInteger)n {
    NSInteger total = 0;
    total = n*(n+1)/2;
    return total;
     }
12、使用Category给某类(哪个类自己思考)增加一个方法,用来完成以下功能:假设一个OC可变数组存放着很多整数字符串,比如@“10”、@“20”.要求调用完这个方法之后,这个数组里面的数字字符是升序排列的,(从小到大排列)
     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)。
   
  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本书本对象按照出版年份—》价格—》名字优先级从小到大排序(出版年份相同按照价格排序,价格相同按照名字排序)
 

你可能感兴趣的:(ios)