0

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);

私は何を間違っていますか?「静的」で構造体を定義する必要がありますか?

ありがとうございました!

4

2 に答える 2

2

Obj-C オブジェクトを C 構造体に格納することは、最近ではかなり悪い考えです。ARC (自動参照カウント) では、もはや許可されていません (これを行うと、コンパイラは文句を言います)。代わりにオブジェクトを使用しないのはなぜですか? オーバーヘッドが心配なために評価メソッドを使用したくない場合は、public ivar を持つオブジェクトを使用してください。パブリック ivar は私見では悪いですが、構造体はパブリック ivar を持つオブジェクトとほとんど同じです。

@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 バージョンのサポートが終了し次第)。

于 2013-01-08T17:58:54.987 に答える
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];
}

また、グローバル変数を使用するときはいつでも、設計を真剣に再検討する必要があるという警告を含めなかったとしたら、私は怠慢になります。

于 2013-01-08T17:59:26.717 に答える