iOS学习笔记

来源:互联网 发布:js判断鼠标在div上 编辑:程序博客网 时间:2024/05/21 22:42

比较好的和基础的博客:

(1)http://blog.csdn.net/linux_zkf

(2)

1. [panGesture requireGestureRecognizerToFail: swipeGesture]; 该函数主要时让panGesture失败,当遇到swipeGesture手势时,只有当swipeGesture失败的时候,才去识别panGesture。为了防止同一个view的手势识别冲突的方法。

2. @property copy属性是non mutable

3. viewDidLoad一般就只在刚加载视图的时候调用一次,加载到内存,然后就直接把在viewDidLoad里的数据驻留在内存在,以备下次使用。ViewVillAppear是每次都要调用的,只要是view从无到有的显示。

4. iOS开发的时候,使用ARC的话,dealloc函数是不需要实现的,写了反而会出错。适当的时候可以使用viewWillAppear或viewDidAppear加载,使用viewWillDisappear或viewDidAppear来释放内存和置空引用。

5. dealloc只有在该对象的引用计数为0时候才调用。

6. 导航控制器一般只能做为最顶层视图控制器,即作为UIWindow的rootViewController,否则会破坏iOS的响应链,导致导航控制器的子控制器不能调用一些代理函数,如:

viewWillAppear系列函数和disappear系列函数,以及一些旋转也不受子控制器的控制了,viewWillLayoutSubviews和viewDidLayoutSubviews也不可使用。因此设计架构时,最好不要这么干。

7. 

iOS提供了ARC功能,很大程度上简化了内存管理的代码。

但使用ARC并不代表了不会发生内存泄露,使用不当照样会发生内存泄露。

下面列举两种内存泄露的情况。

(1),循环参照

A有个属性参照B,B有个属性参照A,如果都是strong参照的话,两个对象都无法释放。

这种问题常发生于把delegate声明为strong属性了。

例,

@interface SampleViewController

@property (nonatomic, strong) SampleClass *sampleClass;

@end


@interface SampleClass

@property (nonatomic, strong) SampleViewController *delegate;

@end


上例中,解决办法是把SampleClass 的delegate属性的strong改为assign即可,或其中之一改为weak也可。


2,死循环

如果某个ViewController中有无限循环,也会导致即使ViewController对应的view关掉了,ViewController也不能被释放。

这种问题常发生于animation处理。

例,

比如,

CATransition *transition = [CATransition animation];

transition.duration = 0.5;

tansition.repeatCount = HUGE_VALL;

[self.view.layer addAnimation:transition forKey:"myAnimation"];


上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。

解决办法是,在ViewController关掉的时候,停止这个animation。

-(void)viewWillDisappear:(BOOL)animated {

    [self.view.layer removeAllAnimations];

}


内存泄露的情况当然不止以上两种。

即使用了ARC,我们也要深刻理解iOS的内存管理机制,这样才能有效避免内存泄露。

8. 如果需要自己重新开发一个视频播放器最好不要使用MPMoviePlayerController,因为这个控制器内置了至少2个苹果自己的功能:
(1)UIPinchGestureRecognizer,用于全屏和非全屏;
(2)双击(2个Tap)扩大屏幕;
(3)不识别1个Tap的手势;
因此建议使用AVPlayer来开发自己的播放器。

9. UIView类是UIResponder的一个子类,因此能够接收用户和视图内容交互时产生的触摸事件。触摸事件从发生触摸的视图开始,沿着响应者链进行传递,直到最后被处理。视图本身就是响应者,是响应者链的参与者,因此可以收到所有关联子视图派发给它们的触摸事件。
处理触摸事件的视图通常需要实现下面的所有方法:
        touchesBegan:withEvent:
        touchesMoved:withEvent:
        touchesEnded:withEvent:
        touchesCancelled:withEvent:
请记住,在缺省情况下,视图每次只响应一个触摸动作。如果用户将第二个手指放在屏幕上,系统会忽略该触摸事件,而不会将它报告给视图对象。如果您希望在视图的事件处理器方法中跟踪多点触摸手势,则需要重新激活多点触摸事件,具体方法是将视图的multipleTouchEnabled属性声明设置为YES。
某些视图,比如标签和图像视图,在初始状态下完全禁止事件处理。您可以通过改变视图的userInteractionEnabled属性值来控制视图是否可以对事件进行处理。当某个耗时很长的操作被挂起时,您可以暂时将这个属性设置为NO,使用户无法对视图的内容进行操作。为了阻止事件到达您的视图,还可以使用UIApplication对象的beginIgnoringInteractionEvents和endIgnoringInteractionEvents方法。这些方法影响的是整个应用程序的事件分发,而不仅仅是某个视图。

在处理触摸事件时,UIKit会通过UIView的hitTest:withEvent:和pointInside:withEvent:方法来确定触摸事件是否发生在指定的视图上。虽然很少需要重载这些方法,但是您可以通过重载来使子视图无法处理触摸事件。(来自:http://blog.csdn.net/linux_zkf)

10. viewWillLayoutSubviews和willAnimateRotationToInterfaceOrientation:duration:除了很显然的不同之外,还有一点不同,前者仅仅是在横向变为纵向或纵向变为横向时候调用,而后者是四个方向都会调用。PS:一般只用前者即可,因为在横向变为横向或纵向变为纵向的时候,并不需要手动布局界面。它们的另一个区别是:当需要重新布局的时候,调用前者;仅仅当屏幕旋转的时候才调用后者。

11. self.view.transform = CGAffineTransformMakeRotation(-M_PI_2);是以self.view的center坐标为中心旋转的。

12. transform转换;transition过渡。

13. 手势识别的回调函数,是在手势被识别过程中的每个阶段都要被调用,即在:Began、Changed/Recognized、Ended过程中调用N次。因此可以在回调函数中判断手势处于的状态,用以提供更加精确的控制。

14. http://www.cocoachina.com/bbs/read.php?tid=110168,记录了UIView animation的学习,不过这事老版本的,新程序应该使用blocks来写动画。

15. 控制系统声音用MPVolumeView。

16. 让MPMoviePlayer和AVAudioPlayer循环播放N首音乐的方法是,在播放器完成播放事件通知代理(委托)函数中直接播放下一首,即可。

17. Interface Builder中可以添加UIView来组合布局若干个控件,来增加整体性。尤其是不好布局的视频播放器view,由于其视图大小未知,因此可以使用UIView来作为容器视图,控制视频播放器view的大小。

18. 管理文件用NSFileManager,处理文件路径用NSString。

19. 加载view一直到显示view:loadView -> viewDidLoad -> viewWillAppear ->viewWillLayoutSubviews -> viewDidLayoutSubviews -> viewDidAppear,为了优化,一般viewDidLoad只加载一次,因此如果想让view在每次显示的时候,做一些事情,就只能在viewWillAppear或viewDidAppear中做;那些只需要加载一次的事情,一般在viewDidLoad中做。另外,viewWillLayoutSubviews和viewDidLayoutSubviews不仅仅是在加载视图时候调用,它们还可以在当前view重新布局子view时候单独调用,但是它们只是在横屏变纵屏或纵屏变横屏时候调用,横向变反横向或纵向变反纵向都不会调用,4个方向都调用的是

willAnimateRotationToInterfaceOrientation:duration:。

viewWillDisappear -> viewDidDisappear。

20. 一个xib文件中,一般只弄一个主view(根View),不要弄多个主view。可以在一个主view上,加入多个子view,而且还推荐。

21. MPMovieScalingModeAspectFit是根据其父view的大小,再根据自身比例来适应自己view大小。如果该view和其父视图的比例不一致,则没有铺满父视图,且在父视图中多余的部分显示黑色。

22. iOS中的KVC和KVO设计模式学习。KVC:基于键(键路径)值的编码;KVO:基于键(键路径)值的观察模式。

23. _memberData就是类的私有数据的另一个写法:self.memberData.

24. IB中的那个对齐方式,是指当前view的supperView改变时,该view作为其父亲的subView的改变方式。

25. iOS中的通知:NSNotificationCenter、NSNotification、NSNotificationQueue。NSNotificationCenter负责处理通知;NSNotification负责生成通知事件;NSNotificationQueue是由通知组成的队列,先进先出。通知事件是由name、object和info(可选)组成。

26. iOS中实用block时候,如果在block引用当前对象中的成员时候,容易出现引用该对象的retain cycle。需要在block对象所在的作用域中使用__block来引用,来解决这个问题。

27. 在调整view大小或位置时候,很有可能使用该view相对于其兄弟view的相对坐标来修正自己。

28. copy是内容拷贝(深拷贝),retain是指针拷贝(浅拷贝)。

29. 调节系统声音用:AVVolumeView或MPMusicPlayerController。

30. UIView中bounds和frame的差别?

翻译文档上的
bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块。
很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。绝对坐标。。。相对坐标。。。比如屏幕旋转的时候就要以相对来重绘。 
frame 如果一个按钮,是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标
我也想知道任何一个uiview如何求得它在屏幕上的坐标。
view 的frame是view在它的super view 的位置与尺寸。
view 的bounds可以用来帮助它的subview来定位的 ,layoutSubviews。
Frame  is  in  terms  of  superview's  coordinate  system   
框架是从父视图的坐标系统
Bounds   is  in  terms  of   local  coordinate  system
是在局部坐标系统
很明显,bounds的原点是(0,0)点,而frame的原点却是任意的。
frame 如果一个按钮,
是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标。
frame 是相对坐标。bounds是绝对坐标。

Android的开发过程中,绝对坐标,这样画出来的位置都是相对于屏幕的而不是相对于控件的

 什么是绝对坐标值,相对坐标值?
绝对坐标是:X,Y    就是相对于坐标原点的。                    
例如(15,20)相对坐标是:@X,Y   就是相对于参考点(可以是自己设定的一个点)。                  
   例如(15,20)相对于参考点(1,1)的坐标,表示:@14,19                            
(15,20)相对于参考点(-1,-1)的坐标,表示:@16,21
bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小.
区别主要在坐标系这一块。
很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。
31. 在ARC下,retain和strong是一样的。
32. UIViewController class reference很重要
33. 在xcode的导航栏中显示分割线(方法分类):一个类中可以有很多的方法,XCODE已经为我们在navigation bar上提供了很34. 方便的列表供选择,查找。一个类里我们总会有一些方法的功能与性质是相差不多的,你可能会有把方法们分组的想法。
#pragma mark - 就是在方法列表里显示的分割线〜 

35. Xcode已经有了类似的支持,它就是 #pragma mark。可以把这句话直接写在代码里,再看看navigationbar是什么效果(见附件)。我们的方法列表被神奇的分组了,组间还有一条华丽的分割线(#pragma mark - 的作用),让你一目了然。

36. 属性中的highlighted是表示选中时候的状态。。。。,例如:

 cell.imageView.image=image;//表示 未选cell时的图片

cell.imageView.highlightedImage=highlightImage;//表示 选中时候的图片。

37. 使用 presentModalViewController  弹出来的是模式窗口,如果[A presentModalViewController:B animated:YES];那么触发关闭事件的一般是在 B里面。B 里面可以 通过 [self dismissModalViewControllerAnimated:YES]; 实现,还可以通过发 消息给A,通知A关闭B
还可以通过委托实现。

38. 获得程序的主Bundle:

NSBundle *bundle = [NSBundle mainBundle]; 

Bundle可以理解成一种文件夹,其内容遵循特定的框架。

Main Bundle一种主要用途是使用程序中的资源文件,如图片、声音、plst文件等。

NSURL *plistURL = [bundle URLForResource:@"plistFile" withExtension:@"plist"];

上面的代码获得plistFile.plist文件的路径。

39. 圆角矩形:直接修改view的样式,系统提供好的了:

#import <QuartzCore/QuartzCore.h>

view.layer.cornerRadius = 6;

view.layer.masksToBounds = YES;

用layer做就可以了,十分简单。这个需要库 QuartzCore.framework;

40. 开发视频播放器时候,设置播放器工具栏是透明的,但是工具不透明的方法:

{方法一} 首先,使用一个UIView1来管理工具,充当工具栏。把工具设为其子类,并设置UIView1背景为clearView;

其次,在代码中动态使用另外一个UIView2,UIView2和UIView1的frame一样大,且设为和UIView1同一个superView,即UIView1和UIView2是兄弟关系。并设置UIView2的透明度为自定义的(自己想要的),并把UIView2设置在最下面的View,即从上层到底层依次是:各种控件 -> UIView1 -> UIView2.

{方法二} 最底层的UIView的alpha设为1,且背景色设为透明;然后给最底层UIView增加同样大小的子UIView,该UIView的alpha设为自定义的(例如:0.2);然后再在最底层UIView上添加子控件;做到最低层的UIView的子UIView和子控件是平行的兄弟关系。即可。

41. UINavigationController的navigation view中的UIView会被navigationBar和状态栏向下挤压:坐标向下移动了。注意调整。

42. 自定义xib文件与自定义(custom)class文件,使它们联系起来的方法是:

分别创建三个文件HabbyClass.m HabbyClass.h HabbyClass.xib,然后在xib文件中,在Placeholders栏上选中[File's Owner],再选中[Identity Ispector],修改[custome class]的class为在HabbyClass.h中的定制class的名称,之后HabbyClass.xib就和HabbyClass.h里的class就联系起来了,就可以使用xib的IBOutlet和IBAction连接了。

ps:File's Owner属性是该xib文件的拥有者,一般是某个定制class。该定制class里定义的所有IBOutlet和IBAction都会在该[File's Owner]的[Connection inspector]属性中显示。一般每个自定义class都有一个view,而且该view被自定义class自动设置为IBOutlet,这个view必须和[objects]属性中的view连接起来,这样该自定义class才真正的和该xib里的view完全连接起来。

43. NSDictionary的类方法:+ (id)dictionaryWithContentsOfFile:(NSString *)path,如果该path代表的文件时空的话,就创建不了NSDictionary对象(创建的为NULL);只有path文件里有内容才能成功创建对象。写到文件中的key和value不能是NSNumber对象。

44. 尽量使用Objective-C里的对象来处理,少用C语言里头的东西。比如:参数传值给(void *),就用OC对象来做。

45. 按下home键时,viewWillDisappear和viewDidDisappear都不会被调用;从home键返回时viewDidLoad和viewWillAppear也不会被调用;只能通过观察者模式(NSNotificationCenter)来监控home键事件。

46. 如果想自己定制后台运行控制,除了UIApplication里的外,可以自己通过通知中心来定制:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(toBackGround:) name:UIApplicationWillResignActiveNotification object:nil]

- (void)toBackground:(NSNotification *)theNotification {

}

47. 退出自己view或viewController时,一定要释放在一开始加载时候申请的资源,并恢复到以前的状态,不要改变别人的数据和状态,和别人一起开发app的话。

48. 在使用导航控制器(UINavigationController)时,当前ViewController的ViewDidAppear和下一个ViewController的ViewWillAppear先后顺序不一定就是当前ViewController的先,是不确定的;一般前者在控制器用will即可。

49. UITableView编辑(增加行或删除行)之前,必须先更新数据源,具体是指影响函数的数据源。

50. copy过去的对象不能被修改;mutableCopy过去的对象可以修改。

51. 有些UIView对象或子类对象不能在IB中调整对其或拉伸参数,可以使用UIViewAutoresingMask参数来达到同样的效果,只是该参数是和IB中的设置是相反的;举例:

UIViewAutoresizingFlexibleLeftMargin就是自动调整与superView左边的距离,也就是说,与superView右边的距离不变。

UIViewAutoresizingFlexibleRightMargin就是自动调整与superView的右边距离,也就是说,与superView左边的距离不变。

原创粉丝点击