资讯专栏INFORMATION COLUMN

Objective-C的数据存储和参数传递

snowLu / 308人阅读

摘要:返回值就是之前存入的值。读取的时候直接读取到的也是数据,需要转化为原来的数据这个方法是的静态方法,通过这个方法可以将还原为原来的数据,这个方法是可失败的,返回值可能是。

最简单的本地数据存储——NSUserDefaults

NSUserDefaults提供了一系列方法,可以存储一些基本数据类型或对象,具体用法有以下几个方法:

初始化方法:静态单例方法,获得默认的本地存储区

+(NSUserDefaults * _Nonnull) standardUserDefaults

添加和修改键值

-(void) setObject:(nullable id) forKey:(nonnull NSString *)

除了setObject:forKey:方法之外还有setBool、setURL、setfloat等方法,用于添加对应的键值。传入的字符串作为键名,以便于区分和在读取的时候使用。

读取键值

-(id _Nullable) objectForKey:(nonnull NSString *)

其中参数就是在调用setObject:forKey:时候所传入键名,同样地也有boolForKey等对用类型的方法。返回值就是之前存入的值。

在存储对象时的注意事项:在存储对象时,如果不是NSData、NSArray、NSMutableArray、NSURL这样的类型,要注意必须先转化为NSData才能存储:

+(NSData * _Nonnull)archivedDataWithRootObject:(nonnull id)

这个方法是NSKeyedArchiver的一个静态方法,通过这个方法可以将任意遵循NSCoding协议的对象转化为NSData。然后再将NSData存入NSUserDefault即可。

读取的时候直接读取到的也是NSData数据,需要转化为原来的数据

+(id _Nullable)unarchiveObjectWithData:(nonnull NSData *)

这个方法是NSKeyedUnarchiver的静态方法,通过这个方法可以将NSData还原为原来的数据,这个方法是可失败的,返回值可能是nil。

参数传递的两种方式

在多视图程序中,视图之间的参数传递显得尤为重要,刚才提到了NSUserDefaults的使用,显然这样的方式可以用于数据传递。这种传递方式比较适合较多视图的参数传递,例如所有视图都需要读取夜间模式的状态,大多数视图需要读取用户是否登陆等,这样的数据用NSUserDefaults进行保持比较合适。而只在两个视图之间的参数传递,可以使用类似于函数参数传递的方式,这种方式依赖于协议和Segue跳转时候的一个方法来实现,这个方法有如下定义:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}

这个方法如此重要,以至于系统在默认创建的ViewController视图类的文件中都会提到。它是在加载一个Segue的时候调用,而且是在跳转之前调用的,根据Apple官方的说明,可以使用 [segue destinationViewController]来获得跳转后的视图控制器,获得之后,可以调用这个视图控制器的方法进行参数传递。这时候推荐将该方法定义为协议。例如有如下的用法:

@protocol DataTransferDelegate 
//该协议规定了视图之间参数传递的方式
@optional
-(void)transferBoolValue:(BOOL)state From:(id)sender;
-(void)transferString:(NSString *)str From:(id)sender;
@end

然后在跳转前的视图控制器类中编写以下方法:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"ToLogInSegue"]) {
    //先对identifier进行判断
        LogInTestViewController *viewController=[segue destinationViewController];
    //获得跳转后的视图控制器
        [viewController transferBoolValue:([_touchidswitch isOn]) From:(self)];
    //调用用于传递参数的协议方法
    }
  }

注意,因为这个方法被所有可加载的Segue所共用,所以在有多个Segue定义的时候,推荐先判断下标示符。

最后,在跳转后的标识符中,使用协议方法来接收参数即可。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/17038.html

相关文章

  • 转:Cocoa Runtime系统知识整理

    摘要:基本是用和汇编写的,可见苹果为了动态系统的高效而作出的努力。苹果和各自维护一个开源的版本,这两个版本之间都在努力的保持一致。而在上面的成员变量列表中也提到过之类的宏定义是苹果在中对系统运行版本进行约束的黑魔法,有兴趣的可以查看源代码。 本文详细整理了 Cocoa 的 Runtime 系统的知识,它使得 Objective-C 如虎添翼,具备了灵活的动态特性,使这门古老的语言焕发生机。主...

    hiyayiji 评论0 收藏0
  • Objective-CBlock

    摘要:结构体在语言中,结构体指的是一种数据结构。结构体同时也是一些元素的集合,这些元素称为结构体的成员,且这些成员可以为不同的类型,成员一般用名字访问。在内存中,编译器按照成员列表顺序分别为每个结构体成员分配内存。 1.相关概念 在这篇笔记开始之前,我们需要对以下概念有所了解。 1.1 操作系统中的栈和堆 注:这里所说的堆和栈与数据结构中的堆和栈不是一回事。 我们先来看看一个...

    smartlion 评论0 收藏0
  • iOS开发60分钟入门

    摘要:黑苹果提到开发入门,似乎没办法不说黑苹果。黑苹果基本可以胜任开发,但有一些问题安装黑苹果是非法的个人行为苹果公司一般不会追究,但会遭同行的鄙视黑苹果超级难装,挑硬件。是苹果应用软件包括苹果电脑上的和移动设备上的的开发语言。 iOS开发60分钟入门 本文面向已有其它语言(如Java,C,PHP,Javascript)编程经验的iOS开发初学者,初衷在于让我的同事一小时内了解如何开始开发...

    wthee 评论0 收藏0
  • iOS知识梳理 - 关于Objective-C

    摘要:内存管理内存管理大体上有三类,开发者手动维护基于引用计数并提供一些机制解决循环引用自动垃圾收集。属于基于引用计数并提供一些机制解决循环引用的。我们知道,朴素的引用计数存在的问题是无法识别循环引用。同属这一流派的还有个的所有权机制。 作为早期的面向对象语言,且直到现在仍然为人们所熟知,Objective-C显然有其独到之处。这里对Objective-C的特点进行简单阐述。 动态?静态? ...

    megatron 评论0 收藏0
  • Objective-C设计模式解析-命令

    摘要:分析命令模式的本质是对命令进行封装,将发出命令的责任和执行命令的责任分割开。系统需要将一组操作组合在一起,即支持宏命令优点缺点优点命令模式的优点降低系统的耦合度。可以比较容易地设计一个命令队列和宏命令组合命令。 看图识模式 前提&场景 我们有若干个军团,军团有若干功能:1.陆地攻击目标 2.轰炸目标 3.保护目标 4.从目标撤退等。将军可以下达指令给军团,调用军团的功能。 需求 在一场...

    Clect 评论0 收藏0

发表评论

0条评论

snowLu

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<