如何在C结构中存储值而不会在调用结构时丢失它们

时间:2013-01-08 17:42:51

标签: objective-c static struct

我定义了C(Objective-C)结构:

struct ResultadoVentaPUP{
    NSString *autenticadoPorPin1;
    NSString *autenticadoPorPin2;
    NSString *tipoPago;
    NSString *importe;
};

然后我声明一个这种类型的变量全局(在文件的顶部):

ResultadoVentaPUP resven;

在函数中,我为此结构设置了值,例如:

resven.importe=@"12.45";

但是当我尝试从同一个文件中查看另一个函数中“importe”的内容时,ir返回(null)。

NSLog(@"Result: %@",resven.importe);

我做错了什么?我应该用'static'定义结构吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

现在将Obj-C对象存储在C结构中是一个相当糟糕的想法,无论如何,使用ARC(自动引用计数),它甚至不再允许(如果你这样做,编译器会抱怨)。为什么不使用对象呢?如果您不想使用评估器方法,因为您担心开销,只需使用带有公共ivars的对象。公共ivars是不好的恕我直言,但结构与公共ivars的对象几乎相同。

@interface ResultadoVentaPUP : NSObject
{
    @public
    NSString * autenticadoPorPin1;
    NSString * autenticadoPorPin2;
    NSString * tipoPago;
    NSString * importe;
}
@end

@implementation ResultadoVentaPUP
@end

ResultadoVentaPUP * resven;


void someFunction () {
    resven = [[ResultadoVentaPUP alloc] init];
    resven->importe = @"12.45";
}

void someOtherFunction () {
    NSLog(@"Result: %@",resven->importe);
}

如果您使用ARC,此代码也可以很好地工作,并且在不久的将来,每个项目迟早都应该迁移到ARC(只要它可以放弃对没有ARC支持的OSX / iOS版本的支持)。

答案 1 :(得分:0)

也许你的声明应该是struct ResultadoVentaPUP resven;。这对我有用:

#import <Foundation/Foundation.h>

struct ResultadoVentaPUP{
    NSString *autenticadoPorPin1;
    NSString *autenticadoPorPin2;
    NSString *tipoPago;
    NSString *importe;
};

struct ResultadoVentaPUP resven;

void func1() {
    resven.importe = @"12.45";
}

void func2() {
    NSLog(@"Result: %@", resven.importe);
}

int main(int argc, char *argv[]) {
    NSAutoreleasePool *p = [[NSAutoreleasePool alloc] init];

    func1();
    func2();

    [p release];
}

如果我不提出任何时候你使用全局变量的话,我会认真地重新考虑你的设计,那将是我的疏忽。