学习内容

欢迎关注我的iOS学习总结——每天学一点iOS:https://github.com/practiceqian/one-day-one-iOS-summary

实现轮播图需要注意的地方

  1. 需要几张轮播图就设置UIScrollView的contentSize的宽度为自身的几倍

    • //设置高度为0是为了限制UIScrollView只能在x轴方向滚动,如果设置x为0那么只能在y轴方向滚动
      CGSizeMake(自身宽度*n,0)
  2. 使用NSTImer定时器定时滚动时避免循环引用

    • 这里一般使用系统的BLock方法加上__weak和__strong的使用
  3. 给UISCrollView加上图片时,每一张图片的x方向位移是初始偏移量加上图片下标*UISCrollView的宽度

    • CGRectMake(初始偏移量+i*(bounds.size.width),0,bounds.size.width-2*初始偏移量,bounds.size.height)
  4. 定时器的使用需要及时的删除/添加,同时注意创建定时器的方式

    • 使用timerwithInterval创建的定时器不会自动添加到RunLoop中,需要手动开启RunLoop

      [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode];
      [[NSRunLoop mainRunLoop] addTimer:timer forMode: UITrackingRunLoopMode];
      //或者直接添加到NSRunLoopCommonModes中
      [[NSRunLoop mainRunLoop] addTimer:timer forMode: NSRunLoopCommonModes];
    • 通过timerWithTimeInterval和initWithFireDate方法创建出来的定时器,都需要手动加入到RunLoop中才会执行,否则不会执行;但是通过scheduledTimerWithTimeInterval创建出来的定时器是自动加入到RunLoop,而且会自动执行

    • 当用户拖动UIScrollView时需要及时的移除定时器,停止拖动时需要及时的加上定时器

      //这里可以设置两个函数,addTimer,removeTimer
      -(void)addTimer{
      __weak typeof(self) weakSelf = self;
      self.bannerTimer = [NSTimer timerWithTimeInterval:3.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
      __strong typeof(weakSelf) strongSelf = weakSelf;
      [strongSelf changePage];
      }];
      [[NSRunLoop mainRunLoop]addTimer:self.bannerTimer forMode:NSDefaultRunLoopMode];
      }
      -(void)removeTimer{
      [self.bannerTimer invalidate];
      self.bannerTimer = nil;
      }
      //scrollview即将开始被拖动
      - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView{
      [self removeTimer];
      }
      //scrollview即将停止拖动
      - (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
      [self addTimer];
      }

iOS中的系统目录

  1. 获取当前应用程序的根目录

    • NSString* homePath = NSHomeDirectory()
  2. 获取应用程序的几个主要目录

    • Documents

      • 保存用户创建的文档文件的目录,用户可以通过文件分享分享该目录下的文件,在iTunes和iCloud备份时会自动备份该目录

      • //NSSearchPathForDirectoriesInDomains返回的是一个字符串数组,但是数组里面只有一个元素
        NSString* docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    • Library

      • 不建议在该目录下保存任何用户相关数据,而是保存APP运行需要的修改数据,用户也可以根据自己的需要进行保存
      • Caches
        • 建议保存数据缓存使用,在用户的磁盘空间已经使用完毕时可能删除该目录中的文件,在APP试用期间不会被删除,但是在APP没有运行的时候系统可能会删除,需要持久化的数据不建议保存在该目录下,防止被系统删除
      • preferences
        • 用户偏好存储目录,使用NSUserDefaults或者CFPreferences接口保存的数据都保存在该目录下,编程人员不需要对该目录进行管理,iTunes和iCloud会自动对该目录进行备份
      • Application State
        • 用来保存与用户数据以外的所有文件,如游戏的新关卡,iTunes和iCloud会自动备份该目录
    • tmp

      • 该目录用来保存临时使用的数据,编程人员应该在数据长时间不使用时主动删除该目录下的文件,在APP不运行期间,系统可能删除该目录下的文件,iTunes和iCloud不会备份该目录的文件
    • SystemData(暂无介绍)

  3. 综上所述,我们保存数据可以保存在Documents、Application State目录下,而preferences用于保存系统接口数据不建议使用,而tmp目录和cache目录中的内容可能会被系统磁盘压力紧张时删除

关于Runloop的一些知识点

  1. RunLoop是什么?

    • RunLoop是一种事件循环,一般的while循环会导致CPU进入忙等状态,而RunLoop则是一种闲等待,当没有事件时,RunLoop会进入休眠状态,当有事件时,Runloop回去寻找相应的Handler处理事件,Runloop可以让线程在需要做事的时候忙起来,在不需要的时候进入休眠状态

      do{
      //获取消息
      //处理消息
      }while(消息!=退出)
    • 一个Runloop对象,包含了一个线程,若干个mode,还有当前运行的mode

    • Runloop和线程是绑定在一起的,每个线程都有一个对应的Runloop对象,我们不能自己创建Runloop对象,但是可以获取到系统提供的Runloop对象

    • 主线程的Runloop会在系统启动时完成启动,其他线程的Runloop默认并不会启动,需要我们手动启动

  2. RunLoop Mode

    • Mode可以视为事件的管家,一个Mode管理着各种事件
    • Mode实际上是source,observer,timer的集合,不同的Mode把不同组的source,observer,timer隔绝开,Runloop在某个时刻只能运行在一个Mode下,处理这一个Mode下的source,observer,timer
    • 苹果文档中提到的Mode共有五个
      • NSDefaultRunLoopMode
      • NSConnectionReplyMode
      • NSModePanelRunLoopMode
      • NSEventTrackingRunLoopMode
      • NSRunLoopCommonModes
      • 但是公开暴露出来接口的只有NSDefaultRunLoopMode和NSRunLoopCommonModes
    • NSRunLoopCommonModes是一个Mode的集合,包含了NSDefaultRunLoopMode和NSEventTrackingRunLoopMode,并不是说RunLoop会运行在这两种模式下,而是相当于分别注册了default和eventtracking两种模式。
  3. RunLoop Source

    • RunLoopSource分为source,timer,observer三种,它们被称作ModeItem
  4. 获取RunLoop

    • //获取当前线程的RunLoop,子线程的RunLoop要在子线程获取
      +(NSRunLoop*)currentRunLoop;
      //获取主线程的RunLoop
      +(NSRunLoop*)mainRunLoop;

iOS中的系统目录(Documents、tmp、Library)、RunLoop的一些知识点的更多相关文章

  1. ios中的RunLoop 和 android 中的Looper

    今天写android程序,用到了Handler,晚上回来查阅资料,发现了Looper这个概念. 看了一下网上关于Looper的资料,发现这个Looper跟ios中的Runloop基本的理念完全一致! ...

  2. IOS 沙盒机制 && 关于document\library\tmp的灵活使用

    默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp.因为应用的沙盒机制,应用只能在几个目录下读写文件Documents:苹果建议将程序中建立的或在程序中浏览到的文件数 ...

  3. IOS 中得runloop 详细解释

    1.Runloop基础知识- 1.1 字面意思 a 运行循环 b 跑圈 - 1.2 基本作用(作用重大) a 保持程序的持续运行(ios程序为什么能一直活着不会死) b 处理app中的各种事件(比如触 ...

  4. iOS中多线程原理与runloop介绍

    一.线程概述 有些程序是一条直线,起点到终点:有些程序是一个圆,不断循环,直到将它切断.直线的如简单的Hello World,运行打印完,它的生命周期便结束了,像昙花一现那样:圆如操作系统,一直运行直 ...

  5. iOS中的存储方式

    1.Plist 1.1 了解沙盒 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其它文件系统隔离.应用必须呆在自己的沙盒里.其它应用不能访问该沙盒. 一个程序中所有的非代码文件都可以 ...

  6. iOS中的一些细节

    1. 在使用单例模式时一般使用allocWithZone 因为alloc最终还是会调用allocWithZone进行分配空间 2. synchronized 线程锁(互斥锁) 优点:能防止多线程抢夺资 ...

  7. iOS中获取各种文件的目录路径的方法

    我们的app在手机中存放的路径是:/var/mobile/Applications/4434-4453A-B453-4ADF535345ADAF344 后面的目录4434-4453A-B453-4AD ...

  8. IOS中获取各种文件的路径介绍及方法

    IOS中获取各种文件的目录路径的方法 技术交流新QQ群:414971585 iphone沙箱模型的有四个文件夹,分别是什么,永久数据存储一般放在什么位置,得到模拟器的路径的简单方式是什么. docum ...

  9. iOS中plist的创建,数据写入与读取

    iOS中plist的创建,数据写入与读取 Documents:应用将数据存储在Documents中,但基于NSuserDefaults的首选项设置除外Library:基于NSUserDefaults的 ...

随机推荐

  1. ADO.NET(一)

    最近在公司有用到了ADO.NET技术,由浅入深的复习一下. 如图所示,水源就像一个水库,进水龙头就像Connection,同理,抽水机:Command,输水管:DataAdapter 或 DataRe ...

  2. 借助leetcode题目来了解BFS和DFS

    广度优先和深度优先搜索 前言 看着这两个搜索的前提的是读者具备图这一数据结构的基本知识,这些可以直接百度一波就了解了.图也像树一样,遍历具有很多的学问在里面,下面我将借用leetcode的题目讲解一下 ...

  3. php 全局变量和超全局变量

    global 全局变量(在当前页面全部地方有效) $GLOBALS['name'] 超全局变量(在整个网站全部地方有效) 一个包含了全部变量的全局组合数组.变量的名字就是数组的键.还有_GET,_PO ...

  4. Nagios基本搭建

    Nagios简述: 1.一款用来监视系统和网络的开源软件 2.利用其从多的插件实现对本机和远端服务的监控 3.当被监控对象异常时,回及时向管理员警告 4.提供一批预设好的监控插件,用户可以直接调用 5 ...

  5. ZK安装、ZK配置、ZK集群部署踩过的大坑

    天天采坑.来来咱们一起来填zookeeper的坑呀!! 解决坑一定要注意zk根目录下的神器,那就是logs目录下的日志, 第一坑:错误: 找不到或无法加载主类 org.apache.zookeeper ...

  6. 如何将Superset嵌入后台系统之实践

    1. 前言 此次实践过程全属个人学习,我选择了在window下安装Superset,并进行嵌入后台系统实践.对此进行实践过程总结,实践成果分享给大家,供大家参考,如果你有更好的想法,欢迎留言交流. 2 ...

  7. 内蒙古特检院利用物联网/RFID技术提高电梯检测水平

    随着电梯检验工作信息化进程的进一步深入,内蒙古特检院从检验工作中寻找新方法.新手段,为检验员新引入电梯检验手持终端设备,力求提高电梯检验水平,将"电梯安全惠民工程"落到实处. 电梯 ...

  8. 01-复杂度2 Maximum Subsequence Sum

    01-复杂度2 Maximum Subsequence Sum   (25分) 时间限制:200ms 内存限制:64MB 代码长度限制:16kB 判题程序:系统默认 作者:陈越 单位:浙江大学 htt ...

  9. 动态规划经典算法--最长公共子序列 LCS

    转移方程 代码: //法一: #include <bits/stdc++.h> using namespace std; //---------------https://lunatic. ...

  10. python(写入 excel 操作 xlwt 模块)

    一.安装 xlwt 模块 pip install xlwt 二.excel 写入操作 这种方式只能新增或者覆盖文件写入 import xlwt # 创建一个workbook 设置编码 workbook ...