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的专栏
收藏
移动平台上的开发主要关注数据以及数据的处理,事件的处理以及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,重写里面的
12345678910- (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;
}
1234567891011121314- (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.
这时候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模式时,也要注意这点。
因为循环引用而产生的内存泄露也是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和Android是目前很火的开发领域。在营收方面跟Android相比iOS目前的状况更为可观。iOS相关的培训和教程也越来越多。相信国外的英文站对很多英语基础好的朋友很有吸引力,必定国外的资源更及时并且更前沿。好的iOS资源学习和工具站会为我们的开发和学习很有帮助。本文介绍了收集到的5个iOS海外学习资源站推荐给大家。
?5个iOS应用开发者海外学习资源站推荐
1. Snipplr
是个不错的代码学习仓库。Snipplr上面有大量的iOS演示代码,有用的框架,组件和完整的开源代码案例。有时当我们在实现一个功能的时候,在写Object C代码要花不少时间和精力。如果想偷懒,可以到Snipplr上去搜索一下看有没有类似的完整代码。它搜索的结果都是站外的链接,如果运气好的话,只需要把代码复制出来修改自定义一下不是很省时省力么。
2. ShareKit
是一种分享组件,它可能很好地整合到你的应用中。根据我的经验我觉得创建和配置社交网络的帐号和API要比将代码整合到应用中花的时间要长。所以如果你的应用需要分享功能并且是海外用户群ShareKit是很不错的iOS社交分享插件,它能够很容易地被整合到应用中,并且从他那里可以了解到目前社交网络中什么事物最火,如何将他们整合到应用中。
3. InAppsSettingsKit
应用中的设置(配置)功能是所有手机等移动开发者都无法逃避的工作。如果你想从一开始就将这些工作量减到最低的话,你可以尝试了解一下的内容。
4. GitHub的Objective-C页面
GitHub在海外有上百万的用户用它来进行代码分享和协作。尽管Objective C在GitHub上只占到2%左右的内容,但是它的仍然是iOS开发者的丰富代码宝藏库。在这里你可以找到知名的和利用广泛的函数库和Framework等。
5. 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类型。