iOS面试题

来源:互联网 发布:贴吧抢楼软件安卓 编辑:程序博客网 时间:2024/06/06 19:23

C语法


(1)C语法

autorelease是延迟释放,释放池执行完时执行释放


1.什么是指针:一个无符号整形数,存放地址的变量


2.float0值比较的if语句

ifa<0.000001&&a>0-0.000001{}

编译分两个阶段compaier变成.o文件 link变成.app文件


3.如何引用一个已经定义的全局变量

extern int numble;


static全局变量和extern比较static作用域比较小,限本文件

static声明的方法相当于+方法


4.volatile 防止编译器优化

队列和桟的区别

队列先进先出,桟先进后出


5.写一个单链表,可以插入数据和删除数据

struct Node

{

    struct Node* next;

}

struct Node* Head;//head 仅仅表示一个链表,不表示元素

void insert(struct Node* pNode)

{

    struct Node* p=Head;

    while (p->next!=NULL) {

        p=p->next;

    }

    p->next=pNode;

}

void insert2(struct Node* pNode)

{

    pNode->next=Head->next;

    Head->next=pNode;

}

void delete(struct Node* pNode)

{

    struct Node* p=Head;

    while (p->next!=NULL&&p->next!=pNode) {

        p=p->next;

    }

    if (p->next!=NULL) {

        p->next=pNode->next;

        free(pNode);

    }

}

6.桟和堆的区别

桟:编译器自动分配和释放

堆:手动分配释放


7.声明一个有10个指针的数组,该指针指向一个函数,该函数

有一个整形参数并返回一个整形数。

int(*array[10])(int x);


8.交换两个变量值,不使用第三方变量

a=a^b,b=a^b;a=a^b;

a=a+b;b=a-b;a=a-b;


9.标准宏

#define MIN(a,b) ((a)>(b)?(b):(a));


(2)OC 语法


1.__block//作用:1保证子线程代码块和外部都是同一个变量。2子线程内部代码块可以修改

__block int y=0;

//子线程

dispatch_async

(dispatch_get_global_queue(0,0),

 ^{

     NSLog(@"%d",y);

})

int y=1;

输出y=1;


2.委托代理与通知中心的区别

代理11,通知 NSNotificationCenter 1对多

代理耦合性高,通知中心低,越低代码重用率越高


3.实现函数回调的几种方式


    1委托代理

    @protocol ContactCtrlDelegate?

    -(void)DismissContactsCtrl;?

    @end?

    2.block

    3.NotificationCenter//通知中心

    4.performSelector//延迟执行函数

    5.C语言的函数指针 void(*Fun)();


4.import include 之间的区别

import可以防止重复包含


6.ARC 与非ARC 区别

    1.ARC 不需要书写release,retain,autorelease

    2.ARC不能写:__weak弱引用,__strong,__bridge强制转换对象,__autoreleasing;


7.ARC MRC 混编-fno-objc-arc;

ARC


8.什么是强弱引用strong,weak;

strong 引用计数会加1weak不会加1;

大部分用强引用,为了避免相互强引用才使用弱引用


9.深浅拷贝

浅拷贝只拷贝内容。深拷贝拷贝内容并重新开辟空间

大部分用浅拷贝,为了优化程序性能

特殊业务需求使用深拷贝


10.NSSet集合是无序的


11.OC中没有多继承,怎么实现

OC语法本身不支持多继承的写法,但是可以用代理或扩展实现

protocol协议就是一堆减方法的集合

Extension扩展,可添加成员变量


如果是笔试题:

1.protocol

2.Extension


11.OC写一个线程,对一个数进行+/-操作


@synchronized//同步的synch

@synchronized/atomic

int x=1;

NSLock *lock=[[NSLock alloc]init];//加锁

dispatch_async(dispatch_get_global_queue(0,0)),

^{

    @synchronized(self)//同步,相当于对这个方法加锁

    {

        x=x-1;

    }

}

//[lock lock];

@synchronized(self)

{

    x=x+1;

    NSLog(@"%d",x);

}

//[lock unlock];


12.Extension扩展,Category分类,继承三者之间的关系和区别

1.三个都是对某个类进行扩展或改写。

2.绝大部分使用继承

3.Category的特点是不需要修改类名,即可对一个类进行扩展或改写

4.Extension扩展是匿名Category,可以追加成员变量


13.创建一个线程,要求可以一直工作,不会只执行一次就结束

dispatch_async(dispatch_get_global_queue(0,0))

^{

    while(1)

    {

        

    }

}

1.break,//结束线程

2.[thread cancel];//比较少用


14.block代码块和delegate完成委托模式有什么优点

block强调代码的封装。

delegate强调代码的可复用


15.OC中有没有私有方法

语法本身没有。但可以实现

.m文件里面声明方法


IOS api

1.AppDelegate生命周期


第一个iOS程序[517:c07] didFinishLaunchingWithOptions-加载完毕

第一个iOS程序[517:c07] applicationDidBecomeActive-获取焦点

按下home键:

第一个iOS程序[517:c07] applicationWillResignActive-失去焦点

第一个iOS程序[517:c07] applicationDidEnterBackground-进入程序后

再按程序:

第一个iOS程序[517:c07] applicationWillEnterForeground-进入前台

第一个iOS程序[517:c07] applicationDidBecomeActive-获取焦点

2.UIViewController生命周期


    1 alloc         创建对象,分配空间

    2init (initWithNibName) 初始化对象,初始化数据

    3loadView       nib载入视图 ,通常这一步不需要去干涉。除非你没有使用xib文件创建视图

    4viewDidLoad    载入完成,可以进行自定义数据以及动态创建其他控件

    5viewWillAppear 视图将出现在屏幕之前,马上这个视图就会被展现在屏幕上了

    6viewDidAppear  视图已在屏幕上渲染完成


3.framebounds区别相对视图不一样,bounds是本视图,frame是父视图


4.ios 7 新增特性

    1.扁平化风格

    2.增加了游戏接口

    3.加入了蓝牙4接口


5.drawRect的调用时机

    1.第一次呈现给用户时

    2.调用setNeedsDisplaysetNeedsDisplayInRect


6.如何实现横竖屏切换,如何令应用程序兼容横竖屏

1.通过配置UIViewController

2.通过私有api


//适配横竖频

_playView.autoresizingMask=UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;


7.iPad开发注意什么

UISplitViewController

UIPopoverController


8.怎么启动一个新线程,子线程怎么刷新UI


Thread对象上调用start()方法,

刷新方法

    1.[self performSelectorOnMainThread:@selector(endThread) withObject:nil waitUntilDone:NO];

    2.[performSelector:onThread:withObject:waitUntil]


9.写一个发送同步Http请求,并获得返回结果的方法,请写出主要逻辑结构。

NSString *str=[[NSString alloc]initWithContentsOfURL:[NSURL URLWithString:@"http://www.baidu.com"] encoding:NSUTF8StringEncoding error:nil];

10。常用数据存储方式

1.NSKeyedArchiver归档

2.NSUserDefaults

3.writeToFile写文件

4.数据库SQLite//要检索数据时用数据库存储连续性强排序


11viewDisLoad,viewDisUnLoad,viewWillAppear,dealloc方法什么时候调用

第一次呈现在客户面前时,内存泄露时,切换到屏幕时调用,最后一次release时调用


12.创建一个空间为2的字典

NSMutableDictionary *dic=[[NSMutableDictionary alloc]initWithCapacity:2];


13.asd|dawd//获取|之前的所有字符

NSRange range=[string rangeOfSubSting:@"|"];

[string substringToIndex:range.location]


14.输出一个小数。实现四舍五入,精确到1位小数

NSLog(@"%.1f",4.449);


15.UIView设置圆角方法

View.layer.cornerRadius=10;


16.推送的实现 apns=apple push notification service

1.手机向苹果服务器apns获取DeviceToken

2.手机将Token上传至应用服务器

3.应用服务器将token和推送内容上传至apns;

4.apns将内容推送至手机

[[UIApplication sharedApplication]registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

AppDelegate中实现函数

didRegisterForRemoteNotificationsWithDeviceToken:

didFailToRegisterForRemoteNotificationsWithError:

17.线程的概念

线程是进程内部的单元,以时间为单位


18.死锁的概念,怎么解决

1.线程循环锁,同步等待

2.不要嵌套使用synchronized


int objA,objB;

dispatch_async(dispatch_get_global_queue(0,0),

^{

    @synchronized(objB)

    {

        @synchronized(objA)

        {

            NSLog(@"");

        }

    }

});

@synchronized(objA)

{

    @synchronized(objB)

    {

        NSLog(@"");

    }

}


19.异步下载和同步下载的优缺点

同步下载开发效率高,但是会造成线程阻塞

不会造成线程阻塞,可以获取下载进度

一般数据请求都用异步下载,在子线程里面不需要获取下载进度时使用


20.

TCPTransmission Control Protocol)面向连接的可靠的传输协议,

UDPUser Datagram Protocol)叫做无连接的、不可靠的传输协议,

HTTPHypertext transfer protocol)超文本传输协议 的概念与应用场景

http基于TCP实现,开发效率高


绝大部分都使用TCP

局域网,实时性要求高时使用UDP

应用比较广泛


21.socket是什么。

网络协议开发包的统称,开发包里面的结构体,

1.创建一个socket

2.初始化socket

a对方的IP地址

b对方设备的端口号

c协议族

3.建立连接 connect

4.a.发送数据 send  b.监听收到的数据receive

5.关闭socket,销毁


22.oc写一个快速排序:分填坑,分治两个步骤

void quickSort(int ary[],init count)

{

    if (count<=1) {

        return;}

    if (count==2) {

        if (ary[0]>ary[1]) {

            int temp=ary[0];

            ary[0]=ary[1];

            ary[1]=temp;

        }

        return;

    }

    int midIndex=0;

    int i=1;

    int j=count-1;

    while (i<j) {//填坑

        if (ary[j]<ary[midIndex]) {

            int temp=ary[midIndex];

            ary[midIndex]=ary[j];

            ary[j]=temp;

        }

        j--;

        if (ary[i]>ary[midIndex]) {

            int temp=ary[midIndex];

            ary[midIndex]=ary[i];

            ary[i]=temp;

        }

        i++;}

    quickSort(ary,midIndex);//分制

    quickSort(ary+midIndex+1,count-midIndex-1);

}


23.设计模式

MVC模式,单例模式、委托代理模式、观察者模式、


MVC模式(Model-View-Controller)

编写单例singleton

+ (id) sharedInstance {

     static id _sharedInstance=nil;

    @synchronized ([AccountManagerclass]) {

        if (_sharedInstance == nil) {

            _sharedInstance = [[AccountManager alloc] init];

        }

    }

    return_sharedInstance;

}

编写代理

@protocol UIActionSheetDelegate <NSObject>

-(void)DismissContactsCtrl;?

@end

@property(nonatomic, assign)id<UIActionSheetDelegate> delegate;

观察者模式通知和KVO以及标准方法NOtifiCationCenter


0 0
原创粉丝点击