面试题,以及答案

1,NSInterger 与int的区别。

会根据系统不同来指定int的长度

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64

typedef long NSInteger;

typedef unsigned long NSUInteger;

#else

typedef int NSInteger;

typedef unsigned int NSUInteger;

#endif

1,线程,有几创建方法,没种创建方法各有什么区别。如果我要几个窜行的线程怎么创建,还有并行的怎么创建。

线程优先级怎么定义。有哪几种优先级。

 2,iOS平台有些什么事件。

答:重力加速度事件,摇动事件,指南针事件,touch事件。

 3,iOS touch 事件的原理,以及是怎么再view 中传递的。



  • iOS的事件分发

  • 2014-01-26     我来说两句    来源:sakulafly的专栏  

  • 收藏    20143703_DaOe.jpg我要投稿

  • 移动平台上的开发主要关注数据以及数据的处理,事件的处理以及UI。所以事件的分发处理是很重要的一个环节,对于一个平台的优劣来说也是一项重要的参数。如果事件的分发设计的不好,一些复杂的UI场景就会变得很难写甚至没法写。从小屏没有触摸的功能机开始到现在大屏多点触摸的智能机,对于事件的分发处理基本思路都是一样的——链(设计模式中有个模式就是职责链chain of responsibility),只是判定的复杂程度不同。

    iOS中的事件有3类,触摸事件(单点,多点,手势)、传感器事件(加速度传感器)和远程控制事件,这里我介绍的是第一种事件的分发处理。

    \

    上面的这张图来自苹果的官方。描述了Responder的链,同时也是事件处理的顺序。通过这两张图,我们可以发现:

    1. 事件顺着responder chain传递,如果一环不处理,则传递到下一环,如果都没有处理,最后回到UIApplication,再不处理就会抛弃

    2. view的下一级是包含它的viewController,如果没有viewController则是它的superView

    3. viewController的下一级是它的view的superView

    4. view之后是window,最后传给application,这点iOS会比OS X简单(application就一个,window也一个)

    总结出来传递规则是这样的:< 喎�"http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgICA8aW1nIHNyYz0="http://www.2cto.com/uploadfile/Collfiles/20140126/2014012608582353.png" alt="\">

    这样事件就会从first responder逐级传递过来,直到被处理或者被抛弃。


    由于UI的复杂,这个responder chain是需要根据事件来计算的。比如,我现在在一个view内加入了2个Button,先点击了一个,则first responder肯定是这个点击过的button,但我下面可以去点击另一个button,所以显然,当触摸事件来时,这个chain是需要重新计算更新的,这个计算的顺序是事件分发的顺序,基本上是分发的反过来。

    \

    无论是哪种事件,都是系统本身先获得,是iOS系统来传给UIApplication的,由Application再决定交给谁去处理,所以如果我们要拦截事件,可以在UIApplication层面或者UIWindow层面去拦截。

    \

    UIView是如何判定这个事件是否是自己应该处理的呢?iOS系统检测到一个触摸操作时会打包一个UIEvent对象,并放入Application的队列,Application从队列中取出事件后交给UIWindow来处理,UIWindow会使用hitTest:withEvent:方法来递归的寻找操作初始点所在的view,这个过程成为hit-test view。

    hitTest:withEvent:方法的处理流程如下:调用当前view的pointInside:withEvent:方法来判定触摸点是否在当前view内部,如果返回NO,则hitTest:withEvent:返回nil;如果返回YES,则向当前view内的subViews发送hitTest:withEvent:消息,所有subView的遍历顺序是从数组的末尾向前遍历,直到有subView返回非空对象或遍历完成。如果有subView返回非空对象,hitTest方法会返回这个对象,如果每个subView返回都是nil,则返回自己。

    好了,我们还是看个例子:

    \

    这里ViewA包含ViewB和ViewC,ViewC中继续包含ViewD和ViewE。假设我们点击了viewE区域,则hit-test View判定过程如下:

    1. 触摸在A内部,所以需要检查B和C

    2. 触摸不在B内部,在C内部,所以需要检查D和E

    3. 触摸不在D内部,但在E内部,由于E已经是叶子了,所以判定到此结束


    我们可以运行一段代码来验证,首先从UIView继承一个类myView,重写里面的

    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event      
    {      
                                 UIView *retView = nil;      
                                 NSLog(@                         "hitTest %@ Entry! event=%@"                         , self.name, event);      
         
                                 retView = [                         super                         hitTest:point withEvent:event];      
                                 NSLog(@                         "hitTest %@ Exit! view = %@"                         , self.name, retView);      
        
                                 return                         retView;      
    }      


    ?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    - (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event      
    {      
                                 BOOL ret = [                         super                         pointInside:point withEvent:event];      
    //    if ([self.name isEqualToString:@"viewD"]) {      
    //        ret = YES;      
    //    }      
                                 if                         (ret) {      
                                     NSLog(@                         "pointInside %@ = YES"                         , self.name);      
                                 }                         else                         {      
                                     NSLog(@                         "pointInside %@ = NO"                         , self.name);      
                                 }      
         
                                 return                         ret;      
    }      


4,全局变量,和局部变量再内存占用上有什么区别。

答:http://wenku.baidu.com/link?url=M8NYcU7hpeGOBOX5eAv6PlesQGa_LdXfdB1Nfp5B8vUj1zk6voSW_JGR6GYtecDdBSoItFtasOGTIpTqc6mIeaP4-J9nX7Pz5NEN6bFSN5a

5,局部变量最大能申请多大的内存,为什么会最大只能这么大内存。

答:iOS平台 最大 能申请279M 的内存 Iphone4S 平台测试 long *test = malloc(1024*1024*280);

6,二分查找函数的实现。

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

答:假设其数组长度为n,其算法复杂度为o(log(n))

下面提供一段二分查找实现的伪代码:

BinarySearch(max,min,des)

mid-<(max+min)/2

while(min<=max)

mid=(min+max)/2

if mid=des then

return mid

elseif mid >des then

max=mid-1

else

min=mid+1

return max

7,view 中动画属性有哪些。

8,ios  中bound 和view 有什么区别。

答;见后面的一遍博文。

9,局部变量和全局变量有什么区别。

答:http://wenku.baidu.com/link?url=ZMY4_Uisy4wyZKa320dmVBiKBUzmWabAasGqw_UFKTfyKvd6JCQwplTpm3Os4hVUeKlfov9Lcpuj5BeRiAUeG23JCDpeiTrPNqp7rpv1C0i

10,什么是delegate,他与通知有什么区别,怎么才能产生循环引用,为什么会产生循环应用。

所有的引用计数系统,都存在循环应用的问题。例如下面的引用关系:

答:

对象a创建并引用到了对象b.

对象b创建并引用到了对象c.

对象c创建并引用到了对象b.

这时候bc的引用计数分别是21。当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1b不会被释放。b不释放,c的引用计数就是1c也不会被释放。从此,bc永远留在内存中。

这种情况,必须打断循环引用,通过其他规则来维护引用关系。比如,我们常见的delegate往往是assign方式的属性而不是retain方式 的属性,赋值不会增加引用计数,就是为了防止delegation两端产生不必要的循环引用。如果一个UITableViewController 对象a通过retain获取了UITableView对象b的所有权,这个UITableView对象bdelegate又是a 如果这个delegateretain方式的,那基本上就没有机会释放这两个对象了。自己在设计使用delegate模式时,也要注意这点。

因为循环引用而产生的内存泄露也是Instrument无法发现的,所以要特别小心。


11,当你有一个bug需要处理,然而又有一个商务会议要开怎么处理

12,ios程序有几种状态。

答:前台,后台,伪后台。从后台关闭。

13,ios 程序controller view 显示的流程。

答:

step1:initWithNib    viewController 会进行alloc,并init.

step2: loadView       在这里会看它的子类是否有重写这个函数,如果重写了则调用子类的,否则就调用她自己的。注意,这个时                       候视图还是没有没加载进来的哦。

step3:viewDidLoad    这个时候视图已经存在了。可以在这里添加你想要添加的UI控件了。

step4:viewWillAppear 视图将出现在屏幕上了

step5:viewDidAppear   视图已经成功在屏幕上渲染完成了

step6:viewWillDisappear  视图将要消失了

step7:viewDidDisappear  视图从屏幕上消失了

step8:viewDidUnLoad  

14,KVO KVC概念

15,runtime 具体怎么用。Runtime编程。

16,一般用到什么开源的动画框架。

17,一般浏览什么样的国外网站。技术网站。

答:

iOS开发者必备的几个国外学习网站  

2012-05-19 17:54:47|  分类: iOS开发|举报|字号 订阅

现在越来越多的开发者参与到了,或正在加入iOS等移动操作系统平台的应用开发行列中来了,iOSAndroid是目前很火的开发领域。在营收方面跟Android相比iOS目前的状况更为可观。iOS相关的培训和教程也越来越多。相信国外的英文站对很多英语基础好的朋友很有吸引力,必定国外的资源更及时并且更前沿。好的iOS资源学习和工具站会为我们的开发和学习很有帮助。本文介绍了收集到的5iOS海外学习资源站推荐给大家。

?5iOS应用开发者海外学习资源站推荐

1. Snipplr

Snipplr是个不错的代码学习仓库。Snipplr上面有大量的iOS演示代码,有用的框架,组件和完整的开源代码案例。有时当我们在实现一个功能的时候,在写Object C代码要花不少时间和精力。如果想偷懒,可以到Snipplr上去搜索一下看有没有类似的完整代码。它搜索的结果都是站外的链接,如果运气好的话,只需要把代码复制出来修改自定义一下不是很省时省力么。

2. ShareKit

ShareKit是一种分享组件,它可能很好地整合到你的应用中。根据我的经验我觉得创建和配置社交网络的帐号和API要比将代码整合到应用中花的时间要长。所以如果你的应用需要分享功能并且是海外用户群ShareKit是很不错的iOS社交分享插件,它能够很容易地被整合到应用中,并且从他那里可以了解到目前社交网络中什么事物最火,如何将他们整合到应用中。

3. InAppsSettingsKit

应用中的设置(配置)功能是所有手机等移动开发者都无法逃避的工作。如果你想从一开始就将这些工作量减到最低的话,你可以尝试了解一下InAppsSettingsKit的内容。

4. GitHub的Objective-C页面

GitHub在海外有上百万的用户用它来进行代码分享和协作。尽管Objective CGitHub上只占到2%左右的内容,但是它的Objective C页面仍然是iOS开发者的丰富代码宝藏库。在这里你可以找到知名的和利用广泛的函数库和Framework等。

5. CocoaDev

CocoaDev也是一个非常优秀的关于iOS开发技能的资源学习网站。它提供了非常丰富和完整的iOS开发信息和iOS开发。

18,NSArray 和NSset遍历哪个速度更快,为什么?

  答:    NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet  , NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray,NSDictionary(都是有序的集合)类声明编程接口对象是有序集合,在内存中存储位置是连续的;


        NSSet和我们常用NSArry区别是:在搜索一个一个元素时NSSet比NSArray效率高,主要是它用到了一个算法hash(散列,也可直译为哈希);开发文档中这样解释:You can use sets as an alternative to arrays when the order of elements isn’t important and performance in testing whether an object is contained in the set is a consideration—while arrays are ordered, testing for membership is slower than with sets.

比如你要存储元素A,一个hash算法直接就能直接找到A应该存储的位置;同样,当你要访问A时,一个hash过程就能找到A存储的位置。而对于NSArray,若想知道A到底在不在数组中,则需要便利整个数组,显然效率较低了;


       NSSet,NSArray都是类,只能添加cocoa对象,如果需要加入基本数据类型(int,float,BOOL,double等),需要将数据封装成NSNumber类型


转载于:https://my.oschina.net/u/1049180/blog/282316

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值