zoukankan      html  css  js  c++  java
  • IOS基础面试题

         最近离职了,找工作,光会做项目,对基础不熟,今天就总结了一点面试题。

         废话不多说,上题吧:

    1.objective-c中的数字对象都有哪些,简述它们与基本数据类型的区别是什么。

    基本类型和C一样,主要是有int、long、double、float、char、void、bool。对于基本数据类型,不需要使用指针,
    NSNumber是OC的数字对象,需要考虑内存释放问题。
    数字类型有:NSInteger、CGFloat。数据对象有NSNumber。对象和变量的差别。可以拆装效果。
    其他的类型有NSString和NSMutableString,NSString是不可变字符串,变量和基本类型一样不需要手动释放。他的
    retainCount是-1。retainCount:我们都知道,在IOS中,使用引用计数来实现内存的管理,当一个对象在任何地方都
    没有被引用到的时候,会被自动释放。这个时候retanCount是0。而且提供了一个-(NSInteger)retainCount的方法来
    实现获取对象的持有数。NSNumber* number = [NSNumber numberWithInt:1];NSLog(@"%lu",[number retainCount]);
    NSArray是一个不可变的数组,一般用于保存固定的数据。NSMutableArray是一个可变数组。可以直接进行操作。
    NSSet是一个不可变集合,NSMutableSet是一个可变集合。集合是一组单值的操作。
    NSDictionary是一个键值对的数据集合。NSMutableDictionary是一组可变的数据键值对。都需要考虑内存释放问题。
    dictionary是按照key来排序的。
    2.用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数。
    CGFLoat number = 3.1415926;
    NSLog("@0.1f",number);
    3.截取字符串”20|http://www.621life.com“ 中 ‘|’字符前面及后面的数据,分别输出它们。
    NSString* normalString = @"20|http://www.621life.com";
    NSArray* array = [normalString componentSeparatedByString:@"|"];
    NSLog(@"%@和%@",array[0],array[1]);
    4.objective-c中的词典对象、可变词典对象是哪个,初始化一个含有两个键值对的可变词典对象,并动态的添加和
    删除一条记录,输出第一条记录。
    NSDictionary和NSMutableDictionary。
    NSMutableDictionary* dictionary = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"val1",@"key1",@"val2",@"key2"];
    NSEnumerator* enumerator = [dictionary keyEnumerator];
    id key = [enumerator nextObject];
    while(key)
    {
    id object = [dictionary objectForKey:key];
    NSLog(@"值:%@,key:%@",,key);
    key = [enumerator nextObject];
    }
    //增加元素:
    [dictionary setObject:@"val3" forKey:@"key3"];
    //删除元素:
    [dictionary removeObjectForKey:@"key1"];
    注意的地方:调用了nectObject之后要重新复制,不然指针指向最末尾处。
    5.获取项目根路径,并在其下创建一个名称为userData的目录。
    NSString* rootPath = NSHomeDirectory();
    NSString* path = [rootPath stringByAppendingString:@"路径"];
    NSFileManager* filemanager = [NSFileMamager defaultManager];
    if(![filemanger fileExistsAtPath:path])
    {
    //创建
    [filemanager createDirectoryAtPath:path];
    }
    6.在一个对象的方法里面:self.name = "object";和name ="object"有什么不同吗?
    self.name="object",这个会让引用计数增加,隐士调用了set方法,如果你自己重写了set
    方法,一定不要这么用,这样子语法会死循环。会使retainCount增加。name="object",直接赋值,
    引用计数不变。
    7.定义属性时,什么情况使用copy,assign,和retain。
    assign是数据类型时候调用,retain和copy用户对象,copy主要是当a指向一个对象,b也想同样指向他的时候出现。
    如果用assign,a如果释放,在调用b,会软件崩溃。如果copy的话,a和b有自己的内存,a释放的时候,b不会崩溃。
    如果用retain的话,会是计数增加,也可以调用。另外,atomic和nonatomic是用来决定编译器生成的setting和getting
    是否是原子操作。在多线程的情况下,原子操作是必须的。否则可能会引起错误信息。
    8.ViewController 的viewDidLoad,viewDidUnload,dealloc,viewWillAppear,viewWillDisappear。
    (1)viewDidLoad只有view在nib文件加载的时候才会调用。
    (2)viewDidUnLoad是在系统内存吃紧的时候才会调用,在该方法中,会将所有的IBOutlet设置成nil,在该方法中释放
    其他的和view有关的对象,其他在运行时创建但是不是系统的对象,在viewDidLoad中创建的对象,缓存数据等release
    对象后,将对象设置成nil。
    (3)dealloc:这个方法是
    流程:loadView/nil来加载view到内存中,viewDidLoad函数进一步初始化这些view,内存不足的时候,调用viewDidUnLoad
    来释放内存数据,当使用的时候,又回到第一步。
    (4)viewWillAppear这个方法是在视图即将调用的时候出现。一般这个时候用代理比较多一点。
    (5)viewWillDisappear这个是在即将消失的时候调用。
    9.写一个发送同步http请求,并获得返回结果的方法。
    同步方法:
    NSMutableURLRequest* request = [[NSMutableRequest alloc] init];
    [request setURL:[URL RULWithString:@"http://www.baidu.com"]];
    [request setHTTPMethod:@"GET"];
    NSData* data = [NSURLConnection sendSynchronousRequest:request returnResponse:nil error:nil];
    10.怎样启动一个新线程,子线程怎样刷新主UI。
    判断一个线程是不是主线程。
    if([NSThread isMainThread])
    IOS中,只有主线程才能立即刷新UI,一般我们放在主线程中,
    dispatch_sync(dispatch_get_main_queue(),^{
    //实现信息
    });
    11.简述objective-c内存管理的实现机制,并简述什么时候由你负责释放对象,什么时候不由你释放。
    OC里面使用retainCount来管理对象,当发送retain的时候,引用计数会自动增加一个,当retainCount为0的时候
    ,系统自动条用release,会自动释放,当一个对象使用如下操作的时候,他就有了使用权限:alloc、allocWithZone、
    copy、copyWithZone、mutableCopy、mutableCopyWithZone。如果没有创建对象或者复制,而是保留引用,同样拥有权限
    retain。在IOS4.0之后,会自动使用ARC来使用内存的管理机制,编译器会自动的使用retain、release、autorelease来
    实现项目的内存管理信息。
    12.类的定义及声明文件以什么为后缀名?
    在IOS里面,类的声明是在.h文件,实现是在.m文件。
    13.怎样自动生成属性的获取方法和设置方法?
    在IOS里面,在现在的话,可以不自动写set和get方法,在.h文件里面定义变量,在.m文件中直接添加_变量就可以了。
    还可以使用@synthesize使用。
    14.声明一个静态方法和一个实例方法。
    +符号表示,表示类的方法,-表示,表示实例方法。静态方法长住内存,但是实例方法不是,所以静态方法效率高但是站
    内存,实例方法相反,加载速度和实际和内存几乎无差。静态方法在堆中分配内存,实例方法在堆栈中分配内存。
    实例方法要先创建对象才能使用,但是静态方法是类的方法,可以直接被类使用。用的比较平凡才使用静态方法,
    静态方法修改的是类的状态,但是实例方法修改的是各个对象的信息。类的实例方法是在类消失的时候,对象没有,
    实例也没有,但是静态方法,只要你还引用这个空间,就一直会存在这个方法。
    15.什么是MVC,你工作时怎样运用它。
    MVC,视图、模型、控制器。view视图,数据json对象模型,controller控制器,view和模型一直不通讯。
    view和controller之间最经典的形式是IBOutlet,也有用纯代码实现的情况。
    16.#define SQUAKE(a)((a)*(a))
    int a=5;
    int b;
    b = SQUAKE(a++);
    此时:b=__30___
    答案 30
    解析: #define SQUAKE(a)((5)*(6))
    17.进程间通信的方式有
    1.管道:用于具有某种亲缘关系进行进程间的通讯,允许一个进程和另一个和他有共同祖先的进程通讯。
    2.命名管道:命名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘
    关系进程间的通信。命名管道在文件系统中有对应的文件名。命名管道通过命令mkfifo或系统调用mkfifo来创建。
    3.信号Signal:信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程
    还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号
    函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction
    函数重新实现了signal函数)。
    4.消息Message队列:消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以
    向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能
    承载无格式字节流以及缓冲区大小受限等缺。
    5.共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低
    而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。
    6.内存映射(mapped memory):内存映射允许任何多个进程间通信,每一个使用该机制的进程通过把一个共享的
    文件映射到自己的进程地址空间来实现它。
    7.信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。
    8.套接口(Socket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分
    支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。
    18.将一个头指针为head且带头结点的单链表反向排列,求算法。
    #include
    using namespace std;
    typedef struct _NODE{
    int x;
    struct _NODE *pNext;
    }NODE;

    #define LEN_NODE ( sizeof(NODE) )

    NODE *pHead = (NODE *) malloc (LEN_NODE);

    void fun( NODE *p )
    {
    NODE *pCur, //curten node of old list
    *pNewCur; //curten node of new list
    pCur = pHead->pNext;
    pHead->pNext = NULL;
    while( pCur )
    {
    if( pHead->pNext != NULL )
    {//link other node
    pNewCur = pHead->pNext;
    pHead->pNext = pCur;
    pCur = pCur->pNext;
    pHead->pNext->pNext = pNewCur;
    }
    else
    {//Link first node
    pHead->pNext = pCur;
    pCur = pCur->pNext;
    pHead->pNext->pNext = NULL;
    }
    }
    //test print
    pCur = pHead->pNext;
    while( pCur )
    {
    printf("%d ", pCur->x );
    pCur = pCur->pNext;
    }
    }

    void main()
    {
    NODE *pCur = pHead;
    int i = 10;
    while( i-- )
    {
    pCur->pNext = (NODE *) malloc (LEN_NODE);
    pCur = pCur->pNext;
    pCur->x = i + 1;
    }
    pCur->pNext = NULL;
    pCur = pHead->pNext;
    while( pCur )
    {
    printf("%d ", pCur->x );
    pCur = pCur->pNext;
    }
    //TEST
    fun(pHead);
    }
    19.C语言中讲讲static变量和static函数有什么作用。
    static有两种意思:1表示变量是静态存储变量,表示变量存放在静态存储区。2表示该变量是内部连接,只在本文件
    内部有效,别的文件不能应用该函数,不加static的函数默认是全局的。
    static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;
    static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值;
    static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。
    20.什么时候用delegate,什么时候用Notifiction?
    delegate用于一对一,notifiction可以用于一对多、一对一、一对无。可以通知多个对象。
    21.用预处理#define声明一个一个常量的时候。
    #SECONDS_YEAR (60 * 60 * 365 * 24) UL
    22.写一个委托信号。
    @protocol MyDelegate
    - (void)didJobs:(NSArray *)args;
    @end

    @protocol MyDelegate;

    @interface MyClass: NSObject
    {
    id delegate;
    }

    这个是我写的一个代理:
    @protocol ProductDelegate<NSObject>
    -(void)doSomeThing:(NSInteger)index;
    @end

    @interface ProductViewController:ViewController
    @property(nonatomic,weak) id<ProductDelegate> prodelegate;
    @end

    //调用这个协议的类 实现接口
    //实现类
    [self doSomeThing:1];
    23.写一个NSString类的实现。


    24.OC有多重继承吗?如果没有,有代替方法吗?
    OC里面要实现多重继承,一般用代理。
    25.obj-c有私有方法么?私有变量呢?
    有,类的变量和实例变量。
    26.关键字const有什么含意?修饰类呢?static的作用,用于类呢?还有extern c的作用。
    const表示只读的意思。
    const int a;
    int const a;
    const int *a;
    int * const a;
    int const * a const;
    分别表示的意思是:前两个的意思一样,表示a是一个常量整型,第三个表示这个是一个这项长整型数的指针。
    第四个表示指向整数的常指针,第五个表示a表示指向一个常整型数的常指针。
    27.为什么标准头文件都有类似以下的结构?
    #ifndef __INCvxWorksh
    #define __INCvxWorksh
    防止被重用呗。
    28.#import跟#include的区别,@class呢?
    @class表示声明,只是知道有这么个东西,至于里面有什么,不用完全知道。#import不会出现重复引用的现象。
    #include表示引用,可能会出现重复引用。
    29.线程与进程的区别和联系?
    进程和线程都是由操作系统所提供的基本单元,系统利用该基本单元实现系统的并发操作。主要差别是在于不同的
    操作系统资源管理方式,进程有独立的地址空间,但是线程没有,一个进程崩溃了,在保护模式下,线程会继续正常运行。
    线程只是一个进程中不同的执行路径。线程有自己的堆栈和局部变量,但是线程没有独立的地址空间,所以一个
    线程死亡的时候,进程也会死亡。多进程的程序比多线程的程序健壮的多。但是要求同时执行又要共享资源只能
    用线程,不能用进程。
    30.例举几个进程的同步机制,比较优缺点。
    1.进程之间通讯的途径:
    2.进程死锁的原因:环路、互斥、请求保持、不可剥夺
    3.死锁的处理:避免策略、检测和解除死锁
    31.堆和栈的区别。
    堆:对象,静态变量名,类名,在项目加载的时候就加载。
    栈:保存变量名。
    32.什么是KV,key和value的操作。
    在OC里面,最经典的操作是字典,一个key对应一个value,根据key来查找对象,键路径是由一个用点来做分隔符的键组成的
    字符串,用于连接在一起的对象序列,第一个键的性质是由先前的性质决定,通过键路径,你可以指定对象图中的任意一个
    深度的路径,指向相关对象的特定属性。
    33.C和OC如何混用。
    后缀名为.m文件可以识别OC文件,混用的方式是将.m文件改成.mm文件。但是cpp文件不能混用OC文件。
    34.自动释放池是什么,如何工作。
    当你在向一个对象发送autorelease的时候,cocoa就会将该对象的一个引用放到最新的自动释放池中,他任然是一个
    正当的对象,因此自动释放池定义的作用域的其他对象可以向他发出消息。
    当程序执行到作用域结束的位置的时候,自动释放池就会自动释放,里面所有的对象就会被释放。
    每碰到copy,retain计数就会加1,每次碰到release、autorelease计数就会减1。
    35.objc的优缺点?
    优点:
    动态识别;
    指标计算;
    弹性信息传递;
    不是一个过度复杂的C衍生语言;
    OC和C++ 可混编语言;
    Posing;
    Cateogies。
    缺点:
    不支持命名空间;
    不支持运算符重载;
    不支持多重继承;
    性能低,因为很多优化方法用不到。
    36.sprintf、strcpy、memcpy使用的时候有什么要注意的吗?
    sprintf:
    strcpy:
    memcpy:
    37.用变量定义a。
    1)整形a int a;
    2)一个指向整形数的指针 int *a;
    3)一个指向指针的指针,指针指向整形数 int** a;
    4)一个有10个整形数的数组 int[] a;
    38.readwrite,readonly,assign,retain,copy,nonatomic 属性的作用。
    property是一个属性访问声明,括号内支持如下属性:
    1.getting和setting,设置setting和getting的方法名。
    readwrite:可读写
    readonly:只读
    assign:数据,
    retain:
    copy:复制
    nonatomic:
    39.http和socket通信的区别?
    http :是客户端用http协议进行请求,发送请求的时候需要封装http请求头,并绑定请求的数据,
    http请求是客户端主动发出请求,服务端才给相应,一次请求完毕之后,会断开连接,节省资源。
    服务端不能主动给客户端响应。除非采用http长连接,iphone主要是使用NSURLConnection技术。
    socket:是客户端和服务器之间使用socket继续套件字继续连接,并没有规定连接后断开,所以
    客户端和服务器之间保持连接通道,双方都可以主动发送数据。一般在游戏或者股票开发的时候
    使用,主要是CFSocketRef。
    40.TCP和UDP协议?
    TCP:传输控制协议,他可以提供可靠的、面向对象的网络数据传递服务。传输控制协议主要包含下面
    任务和功能:
    1)确保IP数据包的成功传递。
    2)对程序发送的大块数据继续封装和重组。
    3)确保正确排序和顺序传递分段的数据。
    4)通过计算校验和,进行传输数据的完整性检查。
    TCP:面向连接的、可靠的数据流传输,数据安全、慢。
    UDP:非面向连接的、不可靠的数据流传递、快。
    41.其他的模式?
    单例模式、代理模式、工厂模式。
    42.什么是push?
    push是客户端程序留下后门端口,客户端总是监听正对对这个后门的请求,于是服务器可以主动的向这个端口
    推送消息。
    43.静态链接库?
    为.a文件,不同的工程里面导入文件就可以使用里面的类。
    44.什么是沙箱模型?哪些操作是属于私有的api范畴?
    沙箱模型:
    在iphone沙箱模型里面,有四格文件夹:documents、tmp、app、Library。手动保存的文件保存在documents里面。
    1.Documents:你应该将所有的应用数据文件写入到这个文件夹里面,这个文件夹主要是存储用于数据或者其他应该备份的东西。
    2.app:这个是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所有你在运行时候不能
    对这个文件夹进行操作。否则程序没法正常运行。
    3.Library:Cache和Preferences两个文件夹,Cache文件夹:用于存放应用程序专用的支持文件,保存应用程序
    再次启动的时候需要的信息。
    Preferences:包含应用程序的偏好设置文件,你不应该直接创建偏好设置文件,而是应该使用NSUserDefault来取得
    和设置应用程序的偏好。
    获取沙盒主目录:
    NSString* homePath = NSHomeDirectory();
    4.获取应用程序程序包中资源文件路径的方法:
    NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
    UIImage* iamge = [[UIImage alloc] initWithContentsOfFile:imagePath];
    45.文件IO写入:
    1.将数据写到Documents目录:
    - (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    if (!docDir) {
    NSLog(@”Documents directory not found!”); return NO;
    }
    NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
    return [data writeToFile:filePath atomically:YES];
    }

    2.从Documents目录读取数据:
    - (NSData *)applicationDataFromFile:(NSString *)fileName {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docDir = [paths objectAtIndex:0];
    NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
    return data;
    }
    NSSearchPathForDirectoriesInDomains这个主要就是返回一个绝对路径用来存放我们需要储存的文件。
    - (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:@"shoppingCar.plist"];
    }
    NSFileManager* fm=[NSFileManager defaultManager];
    if(![fm fileExistsAtPath:[self dataFilePath]]){

    //下面是对该文件进行制定路径的保存
    [fm createDirectoryAtPath:[self dataFilePath] withIntermediateDirectories:YES attributes:nil error:nil];
    //取得一个目录下得所有文件名
    NSArray *files = [fm subpathsAtPath: [self dataFilePath] ];
    //读取某个文件
    NSData *data = [fm contentsAtPath:[self dataFilePath]];
    //或者
    NSData *data = [NSData dataWithContentOfPath:[self dataFilePath]];
    }
    46.用到哪些数据存储方式?
    core data、sqllite、对象序列化、文件直接读写、NSUserDefault。
    文件直接读写>core data>对象序列化>sqllite>NSUserDefault。
    47.线程的常见方法有哪些?你怎么处理的多线程?多线程的问题你了解吗?
    线程创建的几种方式,线程的加锁、休眠、唤醒、解锁、退出。
    多线程要考虑同步的问题,解决的同步问题是对某一个资源进行加锁,当一个线程
    操作本资源的时候,其他线程不能工作。
    系统自带线程池的作用:
    凡是需要启动多个线程的地方都可以使用NSOperationQueue,加入到NSOperationQueue中的对象都需要继承NSoperation。
    NSOperationQueue会在系统内部启动一个独立的线程去执行这个被加入到对象的main方法。
    常用的地方是用NSOperationQueue下载图片,文件。如果是自己创建的一个线程池,无非是启动多个线程的时候,吧这些线程
    对象放入到一个大的数组中,如果需要启动多个线程的时候,先从数组中找空闲的线程来使用。自己管理线程池的
    最大难题是不好处理当启动多个线程的时候,用户在多个界面的跳转的时候,对线程方法的回调处理。
    48.init和initWithObject的区别?
    init创建的对象不带自动释放功能。
    49.你使用过json解析吗?他们底层是怎么样的?
    底层原理是遍历字符串中间的字符,最终根据格式规定的特殊字符,比如:{},[],:。进行区分。{}号是一个字典的开始,
    []是一个数据的开始,:是键值的分水岭,最终是将json转化成字典。字典中可能是字典、数据、字符串而已。
    50.你连接服务器是用什么方式?如果请求中,网络中断怎么办?
    NSURLConnection连接后,有一方系统委托方法来处理服务器的数据,如果网络连接失败,会调用相对应的方法。
    51.xml解析的原理是什么?
    NSXMLParser,其他解析方式是有自定义的二进制解析,就是按照字节去解析,电话会谈就是这样纸,还可以用
    字符串之间用特殊符号用特殊符号连接的数据,将数据用特殊符号可以分割成所用的数据。
    52.类别有什么作用?
    1. 可以使本来需要在.h中声明的方法放到.m文件中声明,达到了可以使方法不对外公开。
    2. 可以方便的扩展类,甚至系统类都可以轻易扩展,维护了代码原本的结构不受影响。
    3. 类别可以写到不同的.h或.m文件中,可以分散代码到跟类别的扩展功能想关联的地方,方便查看。
    53.分线程回调主线程的方法是什么?
    [[self performSelectorOnMainThread:@selector(buttonGo2) withObject:nil] waitUntilDone:YES];
    [self performSelector:@selector(buttonGo2) onThread:[NSThread mainThread] withObject:nil waitUntilDone:YES];
    54.你在开发大型项目的时候,如何进行内存泄露检测的?
    XOCDE里面有一个工具,run-->start with performance tool里面有一个instruments下有一个leaks工具,启动这个
    工具的时候,运行项目,工具里可以显示内存泄露的情况,双击就可以找到源码的位置,可以帮助进行内存泄露问题。
    55.view和view之间怎么传值?
    代理。
    56.让一个物体从界面的一点运行到另一点,有哪些方法?
    动画。
    57.你了解的加密方式?
    MD5、ASE
    58.地图定位?
    我没搞过。
    59.打开URL。
    [[UIApplcation shareApplication] openURL:[NSURL URLWithString:]];
    60.http网络通讯。
    ASIHTTPRequest是一个直接在CFNetwork上做的开源项目:直接提交(HTTP POST)文件的API,异步请求,自动管理上传和下载的队列
    管理机,ASIFormDataRequest用于适合上传文件,图片数据。
    61.图片浏览。
    从相机中选取图片,UIImagePickerController。
    62.对象序列化。
    NSCoding encodeWithCoder initWithCoder
    NSKeyedUnarchiver NSKeyedArchiver
    63.各种picker
    UIDataPicker和UIPickerView。
    64.电影播放、音频播放。

    65.线程?
    线程的创建和使用规则。
    NSThread
    三种方式:
    -(id)init;
    -(id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument;

    线程锁:
    NSCondition方法:
    [thread lock]加锁 [thread singnal]线程启动 [thread unlock]解锁 [thread exit]线程解锁
    sleep(n);
    66.各种排序算法?

    67.通信底层原理。
    答:OSI七层模型
    7 应用层: ftp,smtp,http,telnet,tftp(通过各种协议,最终还是包装成TCP数据包,发送到网络中!)
    6 表现层:
    5 会话层:
    4 传输层: tcp udp
    3 网络层: ip,ICMP,IGRP,EIGRP,OSPF,ARP
    2 数据链路层: STP,VT
    1 物理层:
    68.为什么很多内置类如UITableViewController的delegate属性都是assign而不是retain的?
    会引起循环引用
    所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:
    * 对象a创建并引用到了对象b.
    * 对象b创建并引用到了对象c.
    * 对象c创建并引用到了对象b.

    这时候b和c的引用计数分别是2和1。
    当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放。
    b不释放,c的引用计数就是1,c也不会被释放。从此,b和c永远留在内存中。
    这种情况,必须打断循环引用,通过其他规则来维护引用关系。我们常见的delegate往往是assign方式的属性而不是retain方式 的属性,
    赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。
    如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象b的delegate又是a,
    如果这个delegate是retain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。
    69. 以下每行代码执行后,person对象的retain count分别是多少?
    Person *person = [[Person alloc] init]; count 1
    [person retain]; retain count 2
    [person release];retain count 1
    [person release];retain count = 0
    71.main()
    {
    int a[5]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);
    printf("%d,%d",*(a+1),*(ptr-1));
    }

    答:2,5

    *(a+1)就是a[1],*(ptr-1)就是a[4],执行结果是2,5
      &a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小(本例是5个int)
      int *ptr=(int *)(&a+1);
      则ptr实际是&(a[5]),也就是a+5
    原因如下:
      &a是数组指针,其类型为 int (*)[5];
      而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同。
      a是长度为5的int数组指针,所以要加 5*sizeof(int)
      所以ptr实际是a[5]
      但是prt与(&a+1)类型是不一样的(这点很重要)
      所以prt-1只会减去sizeof(int*)

      a,&a的地址是一样的,但意思不一样
    a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,
    a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。
    72.sprintf、strcpy、memcpy使用的时候有什么要注意的吗?
    这些函数区别在于实现功能和操作对象上,strcpy函数操作的对象是字符串,完成源字符串到目标字符串的功能。
    snprintf函数操作对象是不限于字符串,虽然目标对象是字符串,但是源对象可以是字符串、也可以是任意的基本
    类型的数据。这个函数是用来实现(字符串或者是基本数据类型)向字符串的转化功能。如果元对象是字符串,并且
    指定%s格式符,也可实现字符串拷贝。
    memcpy是内存拷贝,实现将一个内存块的内容复制到另一个内存块中。
    strcpy 无疑是最合适的选择:效率高且调用方便。
    snprintf 要额外指定格式符并且进行格式转化,麻烦且效率不高。
    memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话
    (最优长度是源字符串长度 + 1),还会带来性能的下降。其实 strcpy 函数一般是在内部调用 memcpy 函数或者
    用汇编直接实现的,以达到高效的目的。因此,使用 memcpy 和 strcpy 拷贝字符串在性能上应该没有什么大的差别。
    对于非字符串类型的数据复制来说,strcpy和sprintf一般就无能为力了,但是memcpy就可以。memcpy 的长处是用来
    实现(通常是内部实现居多)对结构或者数组的拷贝,其目的是或者高效,或者使用方便,甚或两者兼有。
    void *memcpy(void *dest, const void *src, size_t n);
    从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
    原型声明:char *strcpy(char* dest, const char *src);
    说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
    返回指向dest的指针。
    int sprintf( char *buffer, const char *format, [ argument] … );

    73.写一个NSString类的实现。
    + (id)initWithCString:(const char *)nullTerminatedCString encoding:(NSStringEncoding)encoding;
    + (id) stringWithCString: (const char*)nullTerminatedCString
    encoding: (NSStringEncoding)encoding
    {
    NSString *obj;
    obj = [self allocWithZone: NSDefaultMallocZone()];
    obj = [obj initWithCString: nullTerminatedCString encoding: encoding];
    return AUTORELEASE(obj);
    }  

    对面试有需要的,仅工参考,我自己写的,如果有不对的地方,欢迎指出。

  • 相关阅读:
    AngularJS--过滤器
    AngularJS--自定义指令和模板
    AngularJS多模块开发
    百度优先收录HTTPS网站?你的网站https还在等什么
    什么是HTTPS
    必须要懂得的密码技术
    如何处理服务器SSL收到了一个弱临时Diffie-Hellman 密钥?
    可以将代码签名证书安装在多台电脑上吗?
    学习第一天
    前端综合知识小集
  • 原文地址:https://www.cnblogs.com/jiaoxiangjie/p/4694808.html
Copyright © 2011-2022 走看看