iOS7开发学习之路:No.9: 引导页之三&内存释放

简介:

之前的两篇Blog介绍了两种不同的引导页的编写方法,但是都各自有各自的缺点:利用scrollView(http://blog.csdn.net/u011156012/article/details/37592445)没有加入可以显示当前页面位置的navigation;如果直接使用PageViewController(http://blog.csdn.net/u011156012/article/details/37739205)的话,默认的屏幕下方的空白区域又显得很扎眼,所以想要改进的话,最终还是采用ScrollView+PageControl的方法来实现。

其实这种方法是在第一种方法上的改进而已,依然是利用ScrollView来实现,不过加上了PageControll而已。

在初始化scrollview的时候也同时初始化pagecontroll

pageControl = [[UIPageControl alloc] init];
    pageControl.frame=CGRectMake(110, 400, 100, 30) ;
    pageControl.numberOfPages = 4; // 一共显示多少个圆点(多少页)
    // 设置非选中页的圆点颜色
    pageControl.pageIndicatorTintColor = [UIColor lightGrayColor];
    // 设置选中页的圆点颜色
    pageControl.currentPageIndicatorTintColor = [UIColor whiteColor];
    // 禁止默认的点击功能
    pageControl.enabled = NO;
    pageControl.backgroundColor=[UIColor  clearColor];
    [self.view addSubview:pageControl];

同时在头文件里面加入对ScrollView的代理 < UIScrollViewDelegate >

同时在下面两个方法里面修改对pagecontroll

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
    //更新UIPageControl的当前页
    CGPoint offset = scrollView.contentOffset;
    CGRect bounds = scrollView.frame;
    [pageControl setCurrentPage:offset.x / bounds.size.width];
}

-(void) scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGFloat pageWidth = self.view.frame.size.width;
    // 在滚动超过页面宽度的50%的时候,切换到新的页面
    int page = floor((scrollView.contentOffset.x + pageWidth/2)/pageWidth) ;
    pageControl.currentPage = page;
}

很简单,这样就ok了。


内存释放

之前开发过程中,总是用在StoryBoard中拖拽进控件的方式来设置页面,这样设计的好处是可以很直观地看到页面的效果,但是缺点是如果所有控件都提前布置好了,容易造成很多内存的浪费,例如有些控件并不需要一直存在,只在需要的时候new一个,然后使用完成后release就好了。这些在MRC时候很容易实现,可是现在iOS的开发都使用ARC了,之前一篇Blog也学习了ARC的一些基础知识,就是在一个对象没有strong类型的指针指向时,它就会自动释放了。下面介绍下如何在程序中手动释放内存。

例如我们手动alloc了一个datepicker

//init the datepicker
    _TheDatePicker= [[UIDatePicker alloc]initWithFrame:CGRectMake(0,self.view.frame.size.height*1/2+5, 0, 0)];
    _TheDatePicker.datePickerMode = UIDatePickerModeDate;
    _TheDatePicker.date = _pickedDate;
    [_TheDatePicker setBackgroundColor:[UIColor whiteColor]];
    [self.view addSubview:_TheDatePicker];

_TheDatePicker是一个私有变量,默认是strong类型的。当我们使用Datepicker选择完成之后,我们需要把他释放掉,因为可能用户之后再也不需要它了,而如果仅仅使用_TheDatePicker setHidden 方法,没法把内存释放掉,释放内存的方法是下面两行函数:

[_TheDatePicker removeFromSuperview];
_TheDatePicker = nil;

不得不提下不知道是不是Xcode5.1的一个bug?就是如果我们事前在storyboard上拖拽进去一个控件,如果我们想在程序中手动改变它的位置,控件的大小必须和之前设置的一致。

就是在我们调用frame = CGRectMaker();里面的4个参数的时候,前面表示x,y坐标的可以改变,但是后面表示width和height的两个值必须和你在storyboard中拖拽进去的值保持一致。否则这个控件的frame是不会改变的。

 

< UIScrollViewDelegate >
目录
相关文章
|
2月前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
57 6
|
3月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
112 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
3月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
68 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
4月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
5月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
44 3
|
5月前
|
Swift iOS开发
iOS开发-属性的内存管理
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),不维持对象生命期,可用于解除循环引用;`assign`(赋值),适用于基本数据类型及非指针对象属性;`copy`,复制对象而非引用,确保对象不变性。iOS采用引用计数管理内存,ARC(自动引用计数)自动处理引用增减,简化开发。为避免循环引用,可利用弱引用或Swift中的`[weak self]`。最佳实践包括:选择恰当的内存管理策略、减少不必要的强引用、及时释放不再使用的对象、注意block内存管理,并使用Xcode工具进行内存分析。
|
6月前
|
Java 运维
开发与运维内存问题之文件句柄泄漏如何解决
开发与运维内存问题之文件句柄泄漏如何解决
88 3
|
6月前
|
缓存 Java Linux
开发与运维内存问题之线上遇到故障,使用jstat命令发现Old区持续增长如何解决
开发与运维内存问题之线上遇到故障,使用jstat命令发现Old区持续增长如何解决
57 2
|
6月前
|
NoSQL Redis C++
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
c++开发redis module问题之在复杂的Redis模块中,特别是使用第三方库或C++开发时,接管内存统计有哪些困难
|
6月前
|
Java 运维
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
开发与运维内存问题之在堆内存中新创建的对象通常首先分配如何解决
27 1