码迷,mamicode.com
首页 > 移动开发 > 详细

IOS面试问题总结

时间:2016-05-07 13:13:17      阅读:324      评论:0      收藏:0      [点我收藏+]

标签:

1.搞清楚touch事件的传递(事件的响应链)

事件的响应(responder chain)

只有继承了UIResponder的类才能响应touch事件,从上图的响应者链可以看出,优先是最上层的view响应事件,如果该view有视图控制器的话会是下一个响应者,否者就是该view的父视图,这样至上而下传递事件。直到单例UIWindow对象,最后是单例UIApplication对象以终止,UIApplication的下一个响应者是nil,已结束整个响应循环。事件在传递过程中视图可以决定是否需要对该事件进行响应。

事件分发(Event Delivery

 第一响应者(First responder)指的是当前接受触摸的响应者对象(通常是一个UIView对象),即表示当前该对象正在与用户交互,它是响应者链的开端。整个响应者链和事件分发的使命都是找出第一响应者。

UIWindow对象以消息的形式将事件发送给第一响应者,使其有机会首先处理事件。如果第一响应者没有进行处理,系统就将事件(通过消息)传递给响应者链中的下一个响应者,看看它是否可以进行处理。

iOS系统检测到手指触摸(Touch)操作时会将其打包成一个UIEvent对象,并放入当前活动Application的事件队列,单例的UIApplication会从事件队列中取出触摸事件并传递给单例的UIWindow来处理,UIWindow对象首先会使用hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为hit-test view

UIWindow实例对象会首先在它的内容视图上调用hitTest:withEvent:,此方法会在其视图层级结构中的每个视图上调用pointInside:withEvent:(该方法用来判断点击事件发生的位置是否处于当前视图范围内,以确定用户是不是点击了当前视图),如果pointInside:withEvent:返回YES,则继续逐级调用,直到找到touch操作发生的位置,这个视图也就是要找的hit-test view
hitTest:withEvent:
方法的处理流程如下:
首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;
若返回NO,hitTest:withEvent:返回nil;
若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从最顶层视图一直到到最底层视图,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;
若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;
如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)

 

2.fame,bounds,center,alpha,opaque,hidden

这些都是view的一些基本属性。frame是描述该view在其父视图中的一块区域。其坐标系是在其父视图中的坐标。我们在进行view的初始化时会经常使用到frame。bounds也是描述该view的大小,是其在自身的坐标系中的位置大小。center是描述其在父视图的中心位置坐标。我们在进行view的位置改变而不改变view的大小的时,会使用center。alpha是用来描述改view的透明度从0到1,0表示的是透明,1表示不透明。alpha支持动画(animation),alpha = 0 与 hidden = YES 效果一样都是看不到view,但是后者相比开销大。在alpha等于0时view接受touch事件,但是hidden则不接受。并且hidden和apaque 不支持动画。alpha并不影响镶嵌在其内部view行为,而hidden会影响。当把view设置为透明背景时,一般把opaque设置为NO,可以减少开销,优化内存.opaque影响图形绘制系统。设置为YES,会优化view的绘制。

 

3,nil,NSNULL,NULL区别

nil是指向obj-c中对象的空指针,是一个对象,在o-c中ni对象调用方法不会引起crash。

Nil是指向obj-c中的类的空指针,表示的是一个空类。

NULL是指向任何类型的空指针(如c/c++中的空指针),在objective-c中是一个数值。

NSNULL用于集合操作,在集合对象中,表示一个空值的集合对象。

 

4.KVC and KVO

KVC(key-value-coding)键值编码,是一种间接操作对象属性的一种机制,可以给属性设置值。通过setValue:forKey:和valueForKey,实现对属性的存取和访问。

KVO(key-value-observing)键值观察,是一种使用观察者模式来观察属性的变化以便通知注册的观察者。通过注册observing对象addObserver:forKeyPath:options:context:和观察者类必须重写方法 observeValueForKeyPath:ofObject:change:context:。常应用MVC模型中,数据库(dataModal)发生变化时,引起view改变。

 

5.NSThread,NSOperation,GCD

NSThread,NSOperation,GCD是IOS中使用多线程的三种方式之一。他们各有优缺点。抽象层次是从低到高的,抽象度越高的使用越简单。

NSThread,缺点:需要自己维护线程的生命周期和线程的同步和互斥,但是这些都需要耗费系统的资源。优点:比其它两个更轻。

NSOperation,优点:不需要自己管理线程的生命周期和线程的同步和互斥等。只是需要关注自己的业务逻辑处理,需要和NSOperationQueue一起使用。

GCD,是Apple开发的一个多核编程解决方法,优点:比前面两者更高效更强大。

 

6.autorelease ,ARC 和非ARC

autorelease 自动释放,与之相关联的是一个自动释放池(NSAutoReleasePool).autorelease的变量会被放入自动释放池中。等到自动释放池释放时(drain)时,自动释放池中的自动释放变量会随之释放。ios系统应用程序在创建是有一个默认的NSAutoReleasePool,程序退出时会被销毁。但是对于每一个RunLoop,系统会隐含创建一个AutoReleasePool,所有的release pool会构成一个栈式结构,每一个RunLoop结束,当前栈顶的pool会被销毁。

ARC,自动应用计数。(iOS 6加入)IOS内存管理是基于变量的应用计数的。这样系统帮你管理变量的release,retain等操作。

非ARC,非自动应用计数。手动管理内存。自己负责系统变量的release,retain等操作。做到谁分配谁释放,及alloc和release像对应。函数返回对象时使用autorelease。

可以使用Xcode将非ARC转化为ARC,ARC和非ARC混编。可在在编译ARC时使用-fno-objc-arc,-fobjc-arc标签。实际需要看工程是支持还是不支持ARC模式。

 

7.xib,storyboard,手动书写代码

xib(interface buider),方便对界面进行编辑。可以在窗口上面直接添加各种视图,优点:直接看到界面的效果,操作简单。缺点:不方便对视图进行动态控制,不灵活。

手动编写代码,继承(主要是UIView,UIViewController),优点:可以对视图进行定制,灵活控制方便。缺点:不能马上看到效果,复杂。

storyboard(故事板在ios6加入)。优点:可以看到界面效果,能同时进行多个界面的交互,高效快速。缺点:不能进行进行界面的定制,却笑灵活性。

xib和storyboard主要用于界面中的元素位置固定和清楚里面有哪些元素。但是如果需要动态变化界面还是手动编写代码比较好。一般还是各种方式混合使用。

 

8.loadView,viewDidLoad,ViewDidUnload,viewWillAppear,viewDidAppear,viewwilldDisappear,viewDidDisappear

当view的nib文件为nil时,手动创建界面时调用loadView,当view的nib文件存在时,会在viewDidLoad中实现。但是当你的程序运行期间内存不足时,视图控制器收到didReceiveMemoryWarning时,系统会检查当前的视图控制器的view是否还在使用,如果不在,这个view会被release,再次调用loadView来创建一个新的View。viewDidLoad ,不论是从xib中加载视图,还是从loadview生成视图,都会被调用。但是如果改view在栈中下一次显示是不会被调用。ViewWillAppear,ViewDidAppear会在view每次即将可见和完全显示时都会调用。我们会在ViewWillAppear里面进行一些view显示的准备工作,ViewDidDi sappear 和ViewWillDisAppear时会在view每次消失时都会调用。当系统收到didReceiveMemoryWarning通知时显示内存不足时,会调用ViewDidUnload来清理View中的数据和release后置为nil。

 

9,copy 和retain区别

retain,相当于指针拷贝。变量的引用计数加一。另外一个指针也指向改地址。

copy,相当于内容拷贝。变量的引用计数加一。但是自己本身计数不变。开辟另外一个地址空间放入相同变量的值进去。

 

10,手动写setter和getter方法

 

- (void) setOldValue: (NSString*) newValue {

    if (newValue !=oldValue) {

        [oldValue release];

        oldValue = [newValue retain];

    }

}


11,NSRunLoop 和NSOperationQueue

NSRunLoop 是所有要监视的输入源和定时源以及要通知的注册观察者的集合.用来处理诸如鼠标,键盘事件等的输入源。每一个线程拥有自己的RunLoop有系统自动创建。你不应该自己去创建,只能获取。一般不会用NSRunLoop,因为它不是线程安全的。一般都用CFRunLoop,这个是线程安全的,是一种消息处理模式,我们一般不用进行处理。

NSOperationQueue时一个管理NSOperation的队列。我们会把NSOperation放入queue中进行管理。

 

12,IOS常用的设计模式

单例模式,DeafutCenter,Deafultqueue等

MVC模式,View,model,ViewController。

观察者模式,通知,KVO

工厂模式,

代理模式,delegate

 

13.内存管理和优化

原则:

1.1    谁创建,谁释放(类似于“谁污染,谁治理”)。如果你通过alloc、new或copy来创建一个对象,那么你必须调用release或autorelease。换句话说,不是你创建的,就不用你去释放。
例如,你在一个函数中alloc生成了一个对象,且这个对象只在这个函数中被使用,那么你必须在这个函数中调用release或autorelease。如果你在一个class的某个方法中alloc一个成员对象,且没有调用autorelease,那么你需要在这个类的dealloc方法中调用release;如果调用了autorelease,那么在dealloc方法中什么都不需要做。

1.2  除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。

1.3  谁retain,谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。有时候你的代码中明明没有retain,可是系统会在默认实现中加入retain。

 

优化:

在收到内存didReceiveMemoryWarning的警告时,释放掉一些不再需要的资源,注意编码规范,如一些变量不使用需要及时的释放。避免是占用太多的内存空间,有时需要用空间去换取时间,尽量使用一些高效的算法和数据结构节约内存空间。最后使用一些内存检测工具和代码的静态分析查找内存泄漏和分配(instrument,leaks,allocations)。

 

14,tableview的优化

优化:

1.1 正确的复用cell。

1.2 减少在返回每个cell里面的处理逻辑和处理时间。尽量将数据进行缓存和复用。

1.3,尽量减少处理加载和计算的时间,不阻塞UI线程。

1.4,尽量使用绘制每个cell。

1.5,设置每个cell的opaque属性。

1.6,尽量返回每行固定的height。

1.7,在每个cell减少图形效果。

1.8,分段加载数据。

 

15,opengl,quatarz 2d

上面2种方式是进行图形绘制会使用到的技术。

quatarz 2d 是Apple提供的基于Core graphic的绘制基本图形工具库。操作简单方便,能够满足大部分需要。只是适用于2D图形的绘制。

opengl,是一个跨平台的图形开发库。适用于2D和3D图形的绘制。功能强大但是复杂。

 

16, animation

IOS提供丰富的Core Animation动画满足用户的需要,主要实现方式如下3种:

1.1  commitAnimations方式使用UIView动画

UIView Animations 动画: 
[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.5f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
//以下四种效果 
/* 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];//oglFlip, fromLeft 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];//oglFlip, fromRight  
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; 
*/ 
//你自己的操作
[UIView commitAnimations];

 

1.2、CATransition

 

    CATransition *animation = [CATransitionanimation];

    animation.duration = 0.5f;

    animation.timingFunction =UIViewAnimationCurveEaseInOut;

    animation.fillMode = kCAFillModeForwards;

    animation.type = kCATransitionMoveIn;

    animation.subtype = kCATransitionFromTop;

    [self.window.layeraddAnimation:animationforKey:@"animation"];

   //自己的操作

1.3、UIView animateWithDuration

方法: +(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations; 
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; //多一个动画结束后可以执行的操作. 

[UIView animateWithDuration:1.25 animations:^{ 
CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2); 
[firstImageView setTransform:newTransform]; 
[secondImageView setTransform:newTransform];} 
completion:^(BOOL finished){ 
[UIView animateWithDuration:1.2 animations:^{ 
//自己的操作} completion:^(BOOL finished){ 自己的操作}]; 
}];

 

17,定制化view 

需要自己自己继承自cocoa touch提供的丰富的类。如(UIView,UiScrollView,UITableView等等)。需要重载实现drawRect,touch事件,init,initFrame等方法。

 

18.core Data,sqlite,file,NSUserDefaults

上面四种是IOS中数据存取的方式。

Core Data,sqlite涉及到数据库。sqlite需要通过sqlite语句操作数据库,而core data是Apple提供的一个基于sqlite更抽象成对象的一种对数据库操作方式。

file,主要是把数据存储在磁盘中。通过写和读文件操作。

NSUserDefaults,主要是存储应用程序中的一些轻量级数据如应用程序的设置和属性和用户信息等。

 

19.机型和尺寸的适配

Iphone 的主要尺寸是3.5和4英寸。分辨率为:320*480,480*960(retina)。

IPad 主要尺寸是7.9和9.7英寸。分辨率为:1024*768,2048*1536(retina)。

 

20.添加手势的方式(gesture和touches事件)

1.自己重载实现touchMoved,touchBegin,touchEnd,touchCanceled事件。

2.通过UIGestureRecongnizer添加AddGestureRecognier事件。该方式方便添加一些诸如点击,双击,拖动等基本的手势事件。

 

21.应用程序的生命周期和状态(参照:http://blog.csdn.net/totogo2010/article/details/8048652

 

Not running  未运行  程序没启动

Inactive          未激活        程序在前台运行,不过没有接收到事件。在没有事件处理情况下程序通常停留在这个状态

Active             激活           程序在前台运行而且接收到了事件。这也是前台的一个正常的模式

Backgroud     后台           程序在后台而且能执行代码,大多数程序进入这个状态后会在在这个状态上停留一会。时间到之后会进入挂起状态(Suspended)。有的程序经过特殊的请求后可以长期处于Backgroud状态

Suspended    挂起           程序在后台不能执行代码。系统会自动把程序变成这个状态而且不会发出通知。当挂起时,程序还是停留在内存中的,当系统内存低时,系统就把挂起的程序清除掉,为前台程序提供更多的内存。

下图是程序状态变化图:

技术分享

各个程序运行状态时代理的回调:

- (BOOL)application:(UIApplication *)application willFinishLaunchingWithOptions:(NSDictionary *)launchOptions
      告诉代理进程启动但还没进入状态保存
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
     告诉代理启动基本完成程序准备开始运行
- (void)applicationWillResignActive:(UIApplication *)application
    当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息或事件,比如来电话了
- (void)applicationDidBecomeActive:(UIApplication *)application 
     当应用程序入活动状态执行,这个刚好跟上面那个方法相反
- (void)applicationDidEnterBackground:(UIApplication *)application
    当程序被推送到后台的时候调用。所以要设置后台继续运行,则在这个函数里面设置即可
- (void)applicationWillEnterForeground:(UIApplication *)application
当程序从后台将要重新回到前台时候调用,这个刚好跟上面的那个方法相反。
- (void)applicationWillTerminate:(UIApplication *)application
当程序将要退出是被调用,通常是用来保存数据和一些退出前的清理工作。这个需要要设置UIApplicationExitsOnSuspend的键值。
- (void)applicationDidFinishLaunching:(UIApplication*)application
当程序载入后执行

 加载应用程序进入前台 

加载应用程序进入后台

22.block编程

Block 是一种具有匿名功能的内嵌函数块。Block 一般是用来表示、简化一小段的程式码,它特别适合用来建立一些同步执行的程式片段、封装一些小型的工作或是用来做为某一个工作完成时的回传呼叫(callback) 。格式如下:^(传入参数列) {行为主体};

 

23.常用的开源框架

网络框架:ASIHttpRequest,AFNetworking,coocaHttpServer等。

进度条:SVprogressHUD,MBprogressHUD,

工具类:SSToolKit等。

分享类:ShareKit等

日志框架:log4j,cocoa lumberJack 等。

等等。

 

24.通知消息和代理的区别

通知:分为本地和远程通知。接受通知的接受者需要进行注册改通知。这样通知被NSNotificationCenter发送出来后会被注册的接受者所接受。远程通知需要借助苹果的服务器去实现通知的中转。

代理:把某个对象要做的事情委托给别的对象去做。

两者区别:

delegate针对one-to-one关系,用于sender接受到reciever的某个功能反馈值。

notification针对one-to-one/many/none,reciver,用于通知多个object某个事件,sender只是负责把notification发送出去。

25.数据解析(json和XML)

json数据的解析通常借助一些开源的框架如:SBJson,TouchJson,jsonKit,Apple 提供的原生的JSon解析 NSJSON Serialization等。去json数据转化为IOS中常用的字典等。

XML数据的解析。xml分为SAX和DOM两种解析方式。

 

DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过遍历树结构可以检索任意XML节点,读取它的属性和值。而且通常情况下,可以借助XPath,直接查询XML节点。

SAX解析XML,是基于事件通知的模式,一边读取XML文档一边处理,不必等整个文档加载完之后才采取操作,当在读取解析过程中遇到需要处理的对象,会发出通知对其进行处理。

一般在iOS平台下,比较常用的XML解析类库有如下几种:

NSXMLParser,,这是一个SAX方式解析XML的类库,默认包含在iOS SDK中,使用也比较简单。

libxml2,是一套默认包含在iOS SDK中的开源类库,它是基于C语言的API,所以使用起来可能不如NSXML方便。这套类库同时支持DOM和SAX解析,libxml2的SAX解析方式还是非常酷的,因为它可以边读取边解析,尤其是在从网上下载一个很大的XML文件,就可以一边下载一边对已经下载好的内容进行解析,极大的提高解析效率。

TBXML,这是一套轻量级的DOM方式的XML解析类库,有很好的性能和低内存占用,不过它不对XML格式进行校验,不支持XPath,并且只支持解析,不支持对XML进行修改。

TouchXML,这也是一套DOM方式的XML解析类库,支持XPath,不支持XML的修改。

KissXML,这是一套基于TouchXML的XML解析类库,和TouchXML相比,支持了XML的修改。

TinyXML,这是一套小巧的基于C语言的DOM方式进行XML解析的类库,支持对XML的读取和修改,不直接支持XPath,需要借助另一个相关的类库TinyXPath才可以支持XPath。

GDataXML,这是一套Google开发的DOM方式XML解析类库,支持读取和修改XML文档,支持XPath方式查询。

 

26.webservice

Web service是一个平台独立的,松耦合的,自包含的、基于可编程的web的应用程序,可使用开放的XML标准描述、发布、发现、协调和配置这些应用程序,用于开发分布式的互操作的应用程序。技术支持包含如下:

1.1 xml 和xsd

1.2 Soap

1.3wsdl

1.4 uddi

1.5调用RPC和消息传递

 

27.开发App的步骤,开发者账号,发布app到appstore

 

  证书分两种:开发者证书、发布者证书。前者开发时使用,后者发布使用 

1) 模拟器调试无需代码签名;真机调试需开发者证书代码签名;发布时需发布证书签名 

2) 代码签名需要:证书+私钥,

3) 真机调试时要求在设备上安装描述文件(provision profile),该文件包含信息:调试者证书,

授权调试设备清单,应用ID。一个应用对应一个描述文件。


28.类继承,类的扩展(extension),类别(category)

 

category 可以在不获悉,不改变原来代码的情况下往里面添加新的方法,只能添加,不能删除修改。
并且如果类别和原来类中的方法产生名称冲突,则类别将覆盖原来的方法,因为类别具有更高的优先级。
类别主要有3个作用:
(1)
将类的实现分散到多个不同文件或多个不同框架中。
(2)
创建对私有方法的前向引用。
(3)
向对象添加非正式协议。
 
继承可以增加,修改或者删除方法,并且可以增加属性。

categoryextensions的不同在于后者可以添加属性。另外后者添加的方法是必须要实现的。
extensions
可以认为是一个私有的Category

29.CAlayer介绍

一个UIView包含CALayer树,CALayer是一个数据模型。包含了一些用来显示的对象,在UIView的子类中都可以找到层这个组件,层是位于固定的画布上的一个子片,可以被覆盖。层是彼此堆叠在一起的最终产生一个界面。除此之层可以包含多个层,通过层可以操作位于此层上面的其他内容,例如旋转,动画,翻页等。

 

30.ios 怎么实现多继承

IOS通过实现protocol委托代理,实现多个接口来实现多继承。

 

31.app性能测试方式

通过Xcode提供的工具如Instrument,测试CPU,Mermory性能。也可以适用一些开源的自动化测试工具:如Frank,KIF等。

 

32.NSArray可以放基本数据类型不(int,float,nil)怎么放进一个结构体

NSArray 只能存放objective-c对象数据模型,这些基本数据类型需要先转化为NSNumber对象再存放进数组中。

 

33.objective-c和c,c++混合编写

在 Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使用。例 如,C++类可以使用Objective-C对象的指针作为数据成员,Objective-C类也可以有C++对象指针做实例变量。Xcode需要源文件以".mm"为扩展名,这样才能启动编译器的Objective-C++扩展。

 

34.常见的语言编码(utf-8,unicode,gb2312,gbk)

常见的语言编码有:

 

GB2312:简体中文编码,一个汉字占用2字节,在大陆是主要编码方式。

BIG5:繁体中文编码。主要在台湾地区采用。 

GBK:支持简体及繁体中文,但对他国非拉丁字母语言还是有问题。 

UTF-8:Unicode编码的一种。Unicode用一些基本的保留字符制定了三套编码方式,它们分别UTF-8,UTF-16和UTF-32。在UTF-8中,字符是以8位序列来编码的,用一个或几个字节来表示一个字符。这种方式的最大好处,是UTF-8保留了ASCII字符的编码做为它的一部分。UTF-8俗称“万国码”,可以同屏显示多语种,一个汉字占用3字节。为了做到国际化,网页应尽可能采用UTF-8编码。

当然,处理中文时http头也要改成UTF-8编码的-----加上<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

 

语言                             字符集                                正式名称

英语、西欧语                ASCII,ISO-8859-1        MBCS多字节

简体中文                      GB2312                          MBCS多字节

繁体中文                      BIG5                               MBCS多字节

简繁中文                      GBK                                MBCS多字节

中文、日文及朝鲜语       GB18030                        MBCS多字节

各国语言                      UNICODE,UCS              DBCS宽字节


 

35.常见的加解密方式(rsa,aes,md5)

常见的加解密方式有:

RSA:基于公钥和私钥的非对程加密算法。适用范围广。

AES:是一种对程加密的流行方式。加密涉及矩阵运算。

MD5:将任意长度的字节串变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算法,

 

36.objective-c语言的优缺点

objc优点:

 

1) Cateogies
2) Posing
3) 动态识别
4) 指标计算
5)弹性讯息传递
6) 不是一个过度复杂的 C 衍生语言
7) Objective-C 与 C++ 可混合编程
缺点:
1) 不支援命名空間
2)  不支持运算符重载

3) 不支持多重继承

4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到。(如内联函数等),性能低劣。


37,ios应用的调试技巧

1.如遇到crash,分析崩溃日志(symbolicatedrash工具的适用)保留崩溃版本的.dSYM文件

2.在 XCode 中进入断点管理窗口;然后点击右下方的 +,增加新的 Exception Breakpoint。

3.如遇到EXC_BAD_ACCESS,打开Scheme选项选择EditScheme。然后按图勾上Enable Zombie Objects和Malloc Stack那两项。

4.有效的日志管理。NSLog和加入一些开源的日志管理框架。

5.程序断点debug模式。

 

38,应用程序性能的调优(转http://www.open-open.com/lib/view/open1365861753734.html

 

1. ARC去管理内存(Use ARC to Manage Memory

   2.适当的地方使用reuseIdentifierUse a reuseIdentifier Where Appropriate

   3.尽可能设置视图为不透明(Set View as Opaque When Possible

   4.避免臃肿的XIBs文件(Avoid Fat XiBs

   5.不要阻塞主进程(Don‘t Block the Main Thread

   6.调整图像视图中的图像尺寸(Size Images to Image Views

   7.选择正确集合(Choose the Correct Collection

   8.启用Gzip压缩(Enable GZIP Compression

    9. 重用和延迟加载视图(Reuse and Lazy Load Views

   10.缓存,缓存,缓存(Cache,Cache,Cache

   11.考虑绘图(Consider Drawing

   12.处理内存警告(Handle Memory Warnings

   13.重用大开销对象(Reuse Expensive Objects

   14.使用精灵表(Use Sprite Sheets 

   15.避免重复处理数据(Avoid Re-Processing Data

   16.选择正确的数据格式(Choose the Right Data Format

   17.适当的设置背景图片(Set  Background Images Appropriately

   18.减少你的网络占用(Reduce Your Web Footprint  

   19.设置阴影路径(Set the Shadow Path 

   20.你的表格视图Optimize Your Table Views

   21.选择正确的数据存储方式(Choose Correct Data Storage Option

   22.加速启动时间(Speed up Launch Time 

   23.使用自动释放池(Use AutoRelease Pool

   24.缓存图像(Cache Images-Or not 

   25.尽可能避免日期格式化器(Avoid Date Formatters Where Possible

 

39.UIScrollView 的contentSize、contentOffSet和contentInset属性的区别

contentSize表示UIScrollView滚动区域的大小。UIScrollView的frame属性在设置好了以后不会随内容的变化而变化。

contentOffSet表示是UIScrollView当前显示区域顶点相对于frame顶点的偏移量,一般用来设置UIScrollView显示的位置。

contentInset表示是scrollview的contentView的顶点相对于scrollview的位置,假设你的contentInset = (0 ,100),那么你的contentView就是从scrollview的(0 ,100)开始显示。一般都是(0,0)表示从scrollView的开始显示。

 

40.IOS6 AutoLayout

AutoLayout是IOS6之后引进的自动布局功能,有点类型有android的相对布局属性。通过勾选AutoLayout设置各种Constraint约束来实现在不同设备和不同方向上的自动布局。autosizing mask也就是 “springs and struts” 模式。autosizing mask决定了一个view会发生什么当它的superview 改变大小的时候。而autolayout 不仅可以设置superview改变时view所做的变化,还支持当相邻view变化时自己所做的变化。

 

*****************************************************************************************

1.简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic,atomic,strong,weak属性的作用?

 

 

答:OC中内存管理机制应该就是引用计数的增减吧,retainCount为0时释放该内存。

 

      retain对应的是release,内存的释放用release。

 

      alloc对应的是dealloc,内存的销毁用dealloc。

 

      readwrite此标记说明属性会被当成读写的,这也是默认属性。

 

      readonly此标记说明属性只可以读,也就是不能设置,可以获取。

 

      assign不会使引用计数加1,也就是直接赋值。

 

      retain会使引用计数加1。

 

      copy建立一个索引计数为1的对象,在赋值时使用传入值的一份拷贝。

 

      nonatomic:非原子性访问,多线程并发访问会提高性能。

 

      atomic:原子性访问。

 

      strong:打开ARC时才会使用,相当于retain。

 

      weak:打开ARC时才会使用,相当于assign,可以把对应的指针变量置为nil。

 

 

 

2.类变量的@protected,@private,@public,@package,声明各有什么含义?

 

 

 

答:@protected 该类和所有子类中的方法可以直接访问这样的变量。

 

      @private 该类中的方法可以访问,子类不可以访问。

 

      @public   可以被所有的类访问

 

      @package 本包内使用,跨包不可以

 

 

 

3.线程是什么?进程是什么?二者有什么区别和联系?

 

 

 

答:线程,有时称为轻量级进程,是被系统独立调度和CPU的基本运行单位。

 

       进程是操作系统中可以并行工作的基本单位。

 

      一个应用程序里至少有一个进程,一个进程里至少有一个线程。

 

   

 

4.谈谈你对多线程开发的理解?iOS中有几种实现多线程的方法?

 

 

 

答:在一个进程中有多个线程,每个线程有自己单独的任务

 

优点效率快   缺点不安全,耗费资源

 

      有三种

 

      第一种,使用@synchronized(self)

 

      第二种,使用GCD

 

      第三种,使用NSOperationQueue

 

 

 

5.线程同步和异步的区别?IOS中如何实现多线程的同步?

 

 

 

答:一个进程启动的多个不相干线程,它们相互之间关系为异步。

 

      同步的话指的是多线程同时操作一个数据 这个时候需要对数据添加保护 这个保护就是线程的同步。
       用GCD中的串行队列来解释多线程的同步,也就是队列中的任务为串行,它们各自对相邻的任务有依赖性,如果任务1不完成,那么任务2就不会开始,这就是同步

6.假设有一个字符串aabcad,请写一段程序,去掉字符串中不相邻的重复字符串,既上述字符串处理之后的输出结果为:aabcd
答:
NSMutableString *str = [[NSMutableString alloc]initWithFormat:@"aabcad"];

NSMutableArray *marry = [[NSMutableArray alloc]init];

    for (int i = 0; i < str.length - 1; i++) {

        unsigned char a = [str characterAtIndex:i];

        for (int j = i + 1; j < str.length; j++) {

            unsigned char b = [str characterAtIndex:j];

            if (a == b) {

                if (j == i + 1) {

 

                }else{

   

               [marry addObject:[NSString stringWithFormat:@"%d",j]];

                }

            }

        }

        }

for (int i = marry.count - 1; i > 0; i--) {

        

        NSInteger num = [[marry objectAtIndex:i]intValue];

        [str deleteCharactersInRange:NSMakeRange(num, 1)];

 

    }

 

7.获取一台设备唯一标示的方法有哪些?
答:1.UDID
      2.UUID
      3.MAC ADDRESS 
        4.OPEN UDID  
        5.广告标识符         
        6.Vindor标示符
ios7之后用的时keychain(钥匙串)
8.ios类是否可以多继承?如果没有,那可以用其他方法实现吗?简述实现过程。
答:没有    用catogory、extension来实现   实现过程我会在ios复习中提到
9.堆和栈的区别?
答:堆需要用户手动释放内存,而栈则是编译器自动释放内存

10.ios本地数据存储都有哪几种方式?
答:1.  NSKeyedArchiver(加密形式)    
       2.  NSUserDefaults
       3.  Write写入方式
       4.  SQLite3
11.写出方法获取ios内存使用情况。
答:
12.深拷贝和浅拷贝的理解?
答:对一个实例进行深拷贝时当前类需要实现NSCopying协议。
       浅拷贝是复制出来一个跟原对象是同一地址的对象,而深拷贝则是复制出来一个跟源对象不同地址的对象,改变原对象,对新对象没有影响。
13.怎样实现一个singleton的类。
答:单例  在复习中也有提到
14.什么是安全释放?
答:把对象指针置为nil,再对其释放。

15.RunLoop是什么?
答:
16.什么是序列化和反序列化,可以用来做什么?如何在OC中实现复杂对象的存储?
答:把对象转换为字节序列的过程称为对象的序列化 
        把字节序列恢复为对象的过程称为对象的反序列化
       将对象写到文件或者数据库里,并且可以读取出来
    遵循NSCoding协议,来实现复杂对象的存储
    实现该协议后就可以对其进行打包或者解包,然后转化为NSData
17.写一个标准宏MIN,这个宏输入两个参数并返回较小的一个?
答:#define MIN((A),(B)) ((A(A:B))

延展问题:写宏的时候要注意些什么问题呢?
函数宏后面的参数都要用括号单独括起来,函数名大写
#define A 20
18.iphone os 有没有垃圾回收机制?简单阐述一下OC内存管理。
答:没有垃圾回收   内存管理同1题
19.简述应用程序按Home键进入后台时的生命周期,以及从后台回到前台时的生命周期?
答:前者进行的方法有
- (void)applicationWillResignActive:(UIApplication *)application
     - (void)applicationDidEnterBackground:(UIApplication *)application
      后者进行的方法有
      - (void)applicationWillEnterForeground:(UIApplication *)application
     - (void)applicationWillResignActive:(UIApplication *)application
20.ViewController 的 alloc,loadView,ViewDidLoad,ViewWillAppear,ViewDidUnload,dealloc,init分别是在什么时候调用的?在自定义ViewController的时候这几个函数里面应该做什么工作?
答:alloc申请内存时调用
     loadView加载视图时调用
     ViewDidLoad视图已经加载后调用
     ViewWillAppear视图将要出现时调用
     ViewDidUnload视图已经加载但没有加载出来调用
     dealloc销毁该视图时调用
     init视图初始化时候调用     
21.描述应用程序的启动顺序。
答:
1. 程序入口main函数创建UIApplication实例和UIApplication代理实例。

2. 在UIApplication代理实例中重写启动方法,设置根ViewController。

3. 在第一ViewController中添加控件,实现应用程序界面。

22.为什么很多内置类如UITableViewControl的delegate属性都是assign而不是retain?请举例说明。
答:
避免循环引用    
比如:对象A创建并引用到了对象B,对象B创建并引用到了对象C,对象C创建并引用到了对象B,这个时候B的引用计数是2,而C的引用计数是1,当A不用B的时候,就释放了B的所有权,这个时候C还引用对象B,所有B不会释放,引用计数为1;因为B也引用着对象C,B不释放,那么C就不会被释放,所有它们的引用计数都为1,并且永远不会被释放,所以形成了循环引用。
23.使用UITableView时候必须要实现的几种方法?
答:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
24.写一个便利构造器。
答:
- (id)studentWithName:(NSString *)name andAge:(NSInter)age{
   MyView *view = [[MyView alloc]initWithName:name andAge:age];
   return [view autorelease];
}
25.UIImage初始化一张图片有几种方法?简述各自的优缺点。
答:
3种
imageNamed:系统会先检查系统缓存中是否有该名字的Image,如果有的话,则直接返回,如果没有,则先加载图像到缓存,然后再返回。
initWithContentsOfFile:系统不会检查系统缓存,而直接从文件系统中加载并返回。
imageWithCGImage:scale:orientation 当scale=1的时候图像为原始大小,orientation制定绘制图像的方向。
1.回答person的retainCount值,并解释为什么?

Person *per = [[Person alloc]init];

self.person = per;
答:1或者2,alloc+1,assign+0,retain+1

2.这段代码有什么问题吗?
@implementation Person
-(void)setAge:(int)newAge{self.age = newAge;}

 

@end

 

 

 

答:死循环

 

 

 

3.这段代码有什么问题,如何修改

 

for(int i = 0;i

 

NSString *string = @"Abc";

 

string = [string lowercaseString];

 

string = [string stringByAppendingString:@"xyz"];

 

NSLog(@"%@",string);

 

}

 

答:在循环里加入自动释放池@autoreleasepool{};

 

 

 

4.截取字符串"20 | http://www.baidu.com"中,"|"字符前面和后面的数据,分别输出它们。

 

答:[string componentsSeparatedByString:@"|"]

 

 

 

5.用obj-c写一个冒泡程序。

 

答:

 

    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"15",@"12",@"5",@"8", nil];

    for (int i = 0; i < array.count - 1; i++) {

        int a = [array[i]intValue];

        for (int j = i + 1; j < array.count; j++) {

            int b = [array[j]intValue];

            if (a < b) {

                [array exchangeObjectAtIndex:i withObjectAtIndex:j];

            }

        }

    }

    for (int i = 0; i < array.count; i++) {

        NSLog(@"%@",array[i]);

    }

 

 

 

 

 

6.简述你对UIView,UIWindow和CALayer的理解。

 

答:UIWindow是应用的窗口

 

      UIView是创建窗口中的一个视图,可以响应交互事件

 

      CALayer不可以响应事件

 

 

 

7.写一个完整的代理,包括声明,实现。

 

答:在具体问题模块会单独介绍

 

 

 

8.分析json、xml的区别?json、xml解析方式的底层是如何处理的?

 

答:json数据小,易解析,不复杂    xml数据较大,比较复杂

 

      json中以key/value形式保存,大多数是字典数组模式

 

      xml中则是<>

 

 

 

9.ViewController的didReceiveMemoryWarning是在什么时候被调用的?默认的操作是什么?

 

答:当应用程序的内存使用接近系统的最大内存使用时,应用会向系统发送内存警告,这时候系统会调用方法向所有的ViewController发送内存警告

 

 

 

10.面向对象的三大特征,并作简单的介绍。

 

答:封装、继承、多态

 

封装:将一个实例的所有属性封装到某个类中

 

继承:子类继承父类所有方法和属性

 

多态:父类指针指向子类对象

 

 

 

11.重写一个NSString类型的,retain方式声明name属性的setter和getter方法。

 

答:

 

- (void)setName:(NSString *)name{

 

   if(_name != name){

 

[_name retain];

 

[_name release];

 

_name = name;

 

}

 

}

 

- (NSString *)name{

 

return [[_name retain]autorelease];

 

}

 

 

 

12.简述NotificationCenter、KVC、KVO、Delegate?并说明它们之间的区别?

 

答:消息中心,消息通知;

 

      利用键-值间接访问类中的某个属性

 

      利用键-路径间接访问类中的某个属性,也称观察者模式

 

      代理,多用于两个类之间的传值

 

      区别:

 

 

 

13.what is lazy loading?

 

答:延时加载,按需加载。

 

 

 

14.什么是Protocol?什么是代理?写一个委托的interface?委托的property声明用什么属性?为什么?

 

答:协议,用来在两个ViewController交互时所定的协议。

 

      代理,第三方中介。

 

      @protocol PersonDelegate NSObject

 

      - (void)setNum;

 

      @end

 

      @property (nonatomic,assign) iddelegate;

 

      防止循环引用

 

 

 

15.分别描述类目(categories)和延展(extensions)是什么?以及两者的区别?继承和类目的实现中有何区别?为什么Category只能为对象添加方法,却不能添加成员变量?

 

答:extensions可以声明属性   不用实现方法;

 

      category可以为当前类生成私有方法,子类不能直接调用;

 

      但是通过继承,子类可以调用父类所有的属性和方法;

 

      回头补上

 

 

 

16.Objective-C 有私有方法吗?私有变量呢?如果没有的话,有没有什么代替的方法?

 

答:没有私有方法,有私有变量

 

      私有方法可以用 category 和 extension 来代替

 

 

 

17.#import、#include和@class有什么区别

 

答:有时间补

 

 

 

18.谈谈你对MVC的理解?为什么要用MVC?在Cocoa中MVC是怎么实现的?你还熟悉其他的OC设计模式或别的设计模式吗?

 

答:M----model    V----view    C----controller

 

      MVC可以让我们的项目框架更加清晰,同时可以让1个controller对应多个model,改代码的时候也方便;

 

      Cocoa中,回头补

 

      单例模式,Delegate模式,KVC模式,消息通知模式,Target/Action模式

 

 

 

19.如检测系统键盘的弹出

 

答:[[NSNotificationCenter defaultCenter]addObserver:self  selector:@selector()  name:UIKeyboardWillShowNotification  object:nil];

 

 

 

20.举出5个以上你所熟悉的ios sdk库有哪些和第三方库有哪些?

 

答:1.AFNetworking

 

      2.ASIHttpRequest

 

      3.shareKit

 

      4.FMDatebase

 

      5.MMDrawerController

 

      回头再研究一些单独列出来

 

 

 

21.如何将产品进行多语言发布?

 

答:国际化语言改成English

 

 

 

22.如何将敏感字变成**

 

答:

 

NSMutableArray *array = [[NSMutableArray alloc]init];//本地敏感字库

    NSString *a = @"敏感字";//本地敏感字库里存的某个敏感字

    NSString *b = @"我";

    

    [array addObject:a];

    [array addObject:b];

    

    //下面是方法

    NSMutableString *s = [[NSMutableString alloc]initWithString:@"我是敏感字"];//要判断的字符串

    for (int i = 0; i < array.count; i++) {

        NSString *minganzi = array[i];

        NSMutableString *replaceString = [[NSMutableString alloc]init];

        for (int j = 0; j < s.length - a.length + 1; j++) {

            NSRange range;

            range.length = minganzi.length;

            range.location = j;

            if ([[s substringWithRange:range] isEqualToString:minganzi]) {

                for (int k = 0; k < range.length; k++) {

                    [replaceString appendString:@"*"];

                }

                [s replaceCharactersInRange:range withString:replaceString];

            }

        }

    }

    NSLog(@"%@",s);

 

 

 

23.objc中的减号和加号代表什么?

 

答:实例对象方法    类方法

 

 

 

24.单例目的是什么,并写出一个?

 

答:节省内存

 

      回头用GCD写一个

 

 

 

25.说说响应链

 

答:nextResponse   View找它的Controller

 

 

 

1.我们说的OC时动态运行时语言是什么意思?什么是动态识别,动态绑定?

 

答:动态类型  --  id     动态绑定  --  @selector()   动态下载

 

 

 

2.分别描述内存管理要点、autorelease、release、NSAutoreleasePool?并说明autorelease是什么时候被release的?简述什么时候由你负责释放对象,什么时候不由你释放?[NSAutoreleasePool release] 和 [NSAutoreleasePool drain]有什么区别?

 

答:

 

 

 

3.说说下面关键词在内存管理的作用:alloc、init、copy、retain、release、autorelease、dealloc、retain count?

 

答:

 

 

 

4.drawRect和layouSubviews 的区别?

 

答:

 

 

 

5.http 和 scoker通信的区别?socker连接相关库,TCP,UDP的区别?

 

答:

 

 

 

6.什么是键值、键路径是什么?

 

答:KVC   setValue:@"" forKey:@""

 

      KVO   setValue:@"" forKeyPath@""

 

 

 

7.声明一个静态方法和一个实例方法?

 

答:类方法与实例方法

 

+(id)personWithName:(NSString *)name{

 

Person *person = [[Person alloc]initWithName:name];

 

return [person autorelease]; 

 

}

 

- (id)initWithName:(NSString *)name{

 

self = [super init];

 

  if(self){

 

self.name = name;

 

}

 

return self;

 

}

 

 

 

8.什么是push?远程推送?

 

答:

 

 

 

9.init和initWithObject区别(语法)?

 

答:后者给属性值

 

 

 

10.请写出代码,用block来取代上例中的protocol,并比较两种方法的优势。实际应用部分?请写出代码,用blocks取代协议或回调方法。

 

答:int (^myBlock)(int) = ^(int a){return a;};

 

回头在具体分析模块中总结

 

 

 

11.你做iphone开发时候,有哪些传值方式,view和view之间是如何传值的?

 

答:属性,Delegate,单例,消息通知,Block

 

 

 

12.给定的一个字符串,判断字符串中是否含有png,有就删除它?

 

答:

 

 

 

13.对于语句NSString* testObject = [[NSData alloc]init];testObject在编译时和运行时分别是什么类型的对象?

 

答:编译时是NSString,运行时是NSData

 

 

 

14.OC中是所有对象间的交互是如何实现的?

 

答:消息机制

 

 

 

15.目标-动作机制

 

答:Target - action

 

 

 

16.for(int index = 0; index < largenumber; index++){

 

NSString *tempStr = @"tempStr";

 

NSLog(tempStr);

 

NSNumber *tempNumber = [NSNumber numberWithInt:2];

 

NSLog(tempNumber);

 

}

 

这段代码有什么问题?会不会造成内存泄露(多线程)?在内存紧张的设备上做大循环时自动释放池是写在循环内好还是循环外号?为什么?

 

答:

 

 

 

17.描述上拉加载、下拉刷新的实现机制?

 

答:

 

 

 

18.什么是沙盒?沙盒包含哪些文件,描述每个文件的使用场景。如何获取这些文件的路径?如何获取应用程序包中文件的路径?

 

答:保护程序安全性

 

      Documents

 

      library

 

      tmp

 

 

 

19.介绍一下XMPP?有什么优缺点?

 

答:回头尝试

 

 

 

20.谈谈对性能优化的看法,如何做?

 

答:根据用户的需求做优化

 

 

 

21.应用程序如何省电?

 

答:先关闭所有跟网络有关的选项,代码里回头补

 

 

 

22.写一个递归方法:计算N的阶乘,然后将计算结果进行存储。以便应用退出后下次启动可直接获取该值。

 

答:

 

@property (nonatomic,assign) int sum;

 

在初始化方法中初始_sum = 1;

 

- (int)cheng:(int)n{

 

if(n != 1){

 

_sum = _sum * n;

 

n--;

 

[self cheng:n];

 

}else{

 

[[NSUserDefaults standerUserDefaults]setObject: [NSString stringWithFormat:@"%d",_sum] forKey:@"cheng"];

 

}

 

}

 

 

 

23.NSArray 和 NSMutableArray 的区别,多线程操作哪个更安全?

 

答:不可变数组更安全

 

 

 

24.当前有一个数组,里面有若干重复的数据,如何去除重复的数据?(会几个写几个)

 

答:1,2,3,4,5,6,7,8,9,10 ………… 99,100

 

将数组中所有数字去出来,存到新数组下标为对应数字的位置

 

 

 

25.isKindOfClass、isMemberOfClass 作用分别是什么?

 

答:前者判断是否属于该类及该类祖宗类,后者只判断是否属于该类

 

 

 

26.写出下面程序段的输出结果

 

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"a string value" forKey:@"akey"];

 

NSLog(@"%@",[dict objectForKey:@"akey"]);

 

[dict release];

 

答:崩溃

 

 

 

27.请写出以下代码的执行结果

 

NSString *name = [[NSString alloc]init];

 

name = @"Habb";

 

[name release];

 

答:申请内存没有用到

 

 

 

28.请分别写出SEL、id的意思?

 

答:动态绑定方法   动态类型

 

 

 

29.iPhone上,不能被应用程序直接调用的系统程序是什么?

 

答:

 

 

 

30.以.mm为拓展名的文件里,可以包含的代码有哪些?c和obj-c如何混用?

 

答:C、Object-C、C++

 

 

 

31.说说如何进行后台运行程序?

 

答:

 

 

 

32.sizeof 和 strlen 的区别和联系?

 

答:前者算内存    后者判断字符串长度

 

 

 

33.sprintf,strcpy,memcpy的功能?使用上要由哪些要注意的地方。

 

答:sprintf:将某类型转换成字符串类型

 

strcpy:拷贝某字符串,长度要相等,考虑‘/0‘

 

memcpy:拷贝内存

 

 

 

34.自己写函数,实现strlen功能。

 

答:

 

int sl(const char *s)

{

    int length = 0;

    while (*s!=‘‘) { 

        s++;

        length++;

    }

    return length;

}

 

 

 

35.写一个代码片段输入一个字符串“20130322152832”,输出一个NSDate类型的对象、打印该对象输出 2013-03-22 15:28:32

 

答:

 

NSDateFormatter *formatter = [[NSDateFormatter alloc]init];

 

[formatter setDateFormat:@"yyyy-MM-dd:HH-mm-ss"];

 

NSLog(@"%@",[formatter stringWithDate:[NSDate date]);

 

 

 

36.找错误

 

a: void test1()

 

{

 

char string[10];

 

char *str1 = "0123456789";

 

加个‘/0‘

 

strcpy(string,str1);

 

}

 

 

 

b:void GetMemory(char **p,int num)

 

{

 

*p = (char *)malloc(num);

 

}

 

 

 

void Test(void)

 

{

 

char *str = NULL;

 

GetMemory(&str,100);

 

strcpy(str,"hello");

 

printf(str);

 

}

 

 

 

37.用变量a写出以下定义

 

a、一个整型数

 

b、一个指向整型数的指针

 

c、一个指向指针的指针,它指向的指针是指向一个整型数

 

d、一个有10个整型数的数组

 

e、一个有10个指针的数组,该指针是指向一个整型数的

 

f、一个指向有10个整型数数组的指针

 

g、一个指向函数的指针,该函数有一个整型参数,并返回一个整型数

 

IOS面试问题总结

标签:

原文地址:http://www.cnblogs.com/Mr-zyh/p/5467857.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!