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的内存管理机制,这样才能有效避免内存泄露。
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。
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的坐标系的坐标和大小.
区别主要在坐标系这一块。
很明显一个是自己为原点的坐标系,一个是以屏幕为原点的坐标系。
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左边的距离不变。
- iOS UIResponder 学习笔记
- ios学习笔记
- iOS 学习笔记
- IOS学习笔记
- ios学习笔记(转)
- ios MapKit学习笔记
- IOS学习笔记1
- ios学习笔记
- IOS UITableView 学习笔记
- IOS学习笔记3
- IOS MapKit学习笔记
- iOS学习笔记
- IOS 学习笔记
- ios学习笔记
- ios学习笔记 UIAlertView
- iOS Runtime 学习笔记
- IOS学习笔记-概述
- iOS学习笔记20131120
- MySQL的安装
- CityEngine 中的 Annotation
- Memcached笔记——(一)安装&常规错误&监控
- UML类图几种关系的总结(泛化 、继承、实现、依赖、关联、聚合、组合)
- 关于view.layout方法参数
- iOS学习笔记
- CLR via C# 读书笔记2-1
- OpenCV for Ios 学习笔记(10)-标记检测总结
- struts2路径问题
- Oracle Flashback技术总结
- php uasort 多维数组中值排序
- CLR via C# 读书笔记2-2
- memmov实现
- mysql 日期操作