zoukankan      html  css  js  c++  java
  • UI:页面传值、单例模式传值、属性传值、NSUserDefaults 数据持久化

    《单页面传值》

    页面传值,从前向后传值,使用属性,在后一个页面定义属性,在前一个页面,用点语法,获得值,在适当的时候传值

    页面传值,从后向前面传值,使用协议和代理,在后一个页面指定协议,定义属性,在前一个页面设置代理对象,在前一个页面的类使其服从协议,在前一个页面实现协议的方法,在后一个页面消失的时候,吧对应的数据作为协议的方法的参数传入第一个页面。
     
    《多页面传值》
    我们使用单例模式,创建一个继承与 NSObject  的基类,然后定义一个创键单例对象的方法,然后设置一个(用来保存传入的数据)属性(@proterty)(nonatomic,copy)NSstring * data;
    定义在方法的外部的变量就是全局变量,(static singletion  * single =nil)单例类用来创建单例对象

      //(为了保证单例类只有一个对象,我们用静态变量来存储对象的指针,一旦发现指针变量为空,则创建单例对象,否则直接返回原来对象的地址)实现

     //对象只有 alloc 没有 release ,这样就存在内存泄露的问题,一般创建单例是用来解决特定的问题,不到万不得已,一般是不会使用单例

     //加锁  安全处理

        @synchronized(self){

            if (!singltion) {

                singltion = [[Singleton alloc]init];

            }

     }

    关于加载图片的时候占用大量内存的解决方案:

    **imageNamed:创建的对象图片会在内存中存储一份,占用内存空间。

    经常使用的图片,使用该方法创建对象, 比如图标
    UIImage *image = [UIImage imageNamed:@"iphone"];
    这种方法只能适用于加载的一些图片很少 或者图片很小 不适用于加载大量图片
    用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的 内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一 个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效

    **根据路径加载图片
    imageWithContentsOfFile是只显示图片,但不加到内存中。
    所以加载大量图片的时候用imageWithContentsOfFile比较好,内存不会变大。
    对于列表界面的图片加载,使用以下方式
    UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"1" ofType:@"jpg"]];
    UIimage 是图片,不是控件;他的父类为NSObject;
    UIImageView是加载图片的控件,父类为UIView 是一个图片加载类 更相当于一个相框 里面可以存放多张图片
    //注意:不管用哪种图片加载图片,图像使用结束后,一定要记得显示释放内存

    轻量级的数据本地化

    NSUserDefaults适合存储轻量级的本地数据,
    NSUserDefaults是一个单例,在整个程序中只有一个实例对象;
    NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

    注意问题:

    通过查看官方文档。UserDefaults不是立即写入,而是根据时间戳定时的把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题。可以通过调用synchornize方法强制写入。

    要点:

     1)NSUserDefaults非常好用,并不需要用户在程序中设置NSUserDefaults的全局变量,需要在哪里使用NSUserDefaults的数据,那么就在哪里创建一个NSUserDefaults对象,然后进行读或者写操作。

     2)针对同一个关键字对应的对象或者数据,可以对它进行重写,重写之后关键字就对应新的对象或者数据,旧的对象或者数据会被自动清理。

     NSUserDefaults用于存储数据量小的数据,例如用户配置。并不是所有的东西都能往里放的,只支持:NSString,NSNumber, NSData, NSArray, NSDictionary,详细方法可以查看类文件。既然可以存储Nsdata 那么只要能够转化为二进制的文件都能够进行本地化的存储。

    NSUserDefaultsstandardUserDefaults用来记录一下永久保留的数据非常方便,不需要读写文件,而是保留到一个NSDictionary字典里,由系统保存到文件里,系统会保存到该应用下的/Library/Preferences/gongcheng.plist文件中。需要注意的是如果程序意外退出,NSUserDefaultsstandardUserDefaults数据不会被系统写入到该文件,不过可以使用[[NSUserDefaults standardUserDefaults] synchronize]命令直接同步到文件里,来避免数据的丢失,这样用户在下次打开程序的时候,数据就不会丢失。

     

  • 相关阅读:
    node.js mongodb笔记
    查询数据库的连接情况
    使用cmd命令查看电脑端口占用情况
    正则表达式基本语法
    ASCII码对照表
    使用命令实现IIS 站点和应用程序池自动启动和停止
    postgresql常见命令及操作
    apigateway-kong(四)负载均衡理论及实现
    apigateway-kong(三)Proxy规则
    apigateway-kong(二)admin-api(结合实例比官网还详细)
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/4793677.html
Copyright © 2011-2022 走看看