如何在NSObject中保存数据

时间:2013-12-01 18:38:25

标签: ios nsobject

当用户按下登录时,我正在使用Restkit返回一堆对象。我需要将这些不同的对象和属性存储在自定义的NSObject中,以便在整个应用程序中进行参考。

我不是Objc的天才,这就是为什么我需要一个例子并解释我做错了什么。 SO没有自定义NSObjects的任何示例,这就是我在这里问的原因。

在此先感谢,我一定会接受正确答案。

在loginViewController中我有这个在自定义NSObject中设置数组:

Crap *crapper = [[Crap alloc] init];
        [crapper setCrapArray:array];

这是Crap.h:

#import <Foundation/Foundation.h>

@interface Crap : NSObject <NSCoding> 

@property (nonatomic, retain) NSArray *crapArray;

- (void)encodeWithCoder:(NSCoder *)enCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

@end

和Crap.m:

#import "Crap.h"

@implementation Crap

@synthesize crapArray;

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.crapArray forKey:@"crapArray"];

}

- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.crapArray = [decoder decodeObjectForKey:@"crapArray"];

    }
    return self;
}

@end

我正在使用它来检索FeedViewController中的数据:

Crap *crap = [[Crap alloc] init];
NSLog(@"%d", crap.crapArray.count);

当然是0(数组计数真的是40个)。

2 个答案:

答案 0 :(得分:2)

您的标题Crap文件应为

#import <Foundation/Foundation.h>

@interface Crap : NSObject <NSCoding>

@property (nonatomic, retain) NSArray *crapArray;

+ (Crap *) crap;

- (void)encodeWithCoder:(NSCoder *)enCoder;
- (id)initWithCoder:(NSCoder *)aDecoder;

@end

你的实现Crap文件应该是

#import "Crap.h"

@implementation Crap

@synthesize crapArray;

+ (Crap *) crap {
    static Crap *crap = nil;
    if (!crap) {
        crap = [[super allocWithZone:nil] init];
    }

    return crap;
}

+ (id) allocWithZone:(struct _NSZone *)zone {
    return [self crap];
}

- (id) init {
    self = [super init];
    if (self) {
        // set default property values
        crapArray = nil;
    }

    return self;
}

- (void)encodeWithCoder:(NSCoder *)encoder {
    //Encode properties, other class variables, etc
    [encoder encodeObject:self.crapArray forKey:@"crapArray"];

}

- (id)initWithCoder:(NSCoder *)decoder {
    if((self = [super init])) {
        //decode properties, other class vars
        self.crapArray = [decoder decodeObjectForKey:@"crapArray"];

    }
    return self;
}

@end

然后设置你要做的事情,比如

[Crap crap].crapArray = [NSArray arrayWithObjects:@"Hello", @"Bye", nil];

要从另一个视图控制器获取该值,您必须执行类似

的操作
NSLog(@"Value: %d", [[Crap crap] crapArray].count);

如果你这样做

Crap *crap = [[Crap alloc] init];
NSLog(@"%d", crap.crapArray.count);

crapArray将被设置为nil并且你将再次获得0,因为我们在init方法上将crapArray设置为nil。

答案 1 :(得分:0)

startObject.h

#import <Foundation/Foundation.h>

@interface startObject : NSObject

@property (nonatomic, retain) NSArray *crapArray;

@end

startObject.m

import“startObject.h”

@implementation startObject

@synthesize crapArray;


- (id)init {

    self = [super init];

    return self;
}
@end

使用:

startObject* start = [[startObject alloc] init];

start.crapArray = [NSArray arrayWithObjects:@"Alpha", @"Beta", @"Gamma", @"Omega", nil];

NSLog(@"%@",start.crapArray);

结果:

(
Alpha,
Beta,
Gamma,
Omega
)

上面的代码用于将数据保存到NSObject。而已。 要发布它的内容,只需设置start = nil

但是,如果您希望使用存档将数据保存到磁盘,请告诉我们。另请查看here以获取有关使用NSCoding的详细教程。