-4

あるクラスから別のクラスに変数を読み取るためのヘルプが必要です。私はこれについていくつかの答えに従いましたが、成功しませんでした。

PP.h:

@interface PP : UIViewController
{
@public int fNum;
}

@property (readwrite, nonatomic) int fNum;

- (IBAction)setSomeNum;

@end

PP.m:

@synthesize fNum;

- (IBAction)setSomeNum
{
fNum = 69;
NSLog(@"Set Num Activated %d",fNum); //OK
}

TryView.m:

#import "TryView.h"
#import "PP.h"

@interface TryView ()

@end

@implementation TryView
- (void)viewDidLoad
{
[super viewDidLoad];

PP *obj ;
int x = obj.fNum;
NSLog(@"Happines %d",x); //Prints 0
}
@end

何が問題なのですか、なぜ0を出力するのですか?

4

2 に答える 2

8

あなたがしていることは本質的に未定義の振る舞いなので、クラッシュしなかったことを嬉しく思います。

PP *obj ;
int x = obj.fNum;

は根本的に間違っています-オブジェクトを作成/初期化していないのでobj、ダングリングポインタも同様です。これは、任意の場所(つまり、ガベージ)を指し、アクセスするとクラッシュする可能性があります。オブジェクトを作成した場合でも、そのオブジェクトでsetSomeNumメソッドを呼び出す必要があります。自動的に呼び出されることはありません(なぜそうする必要があるのですか?)。全体として、あなたはこれを書かなければなりません:

PP *obj = [[PP alloc] init];
[obj setSomeNum];
int x = obj.fNum;

于 2012-09-02T11:43:24.487 に答える
1

http://developer.apple.com/library/ios/#documentation/general/conceptual/devpedia-cocoacore/accessormethod.htmlなどの基本的なリファレンスをお読みください。KVOを適切に使用していない、使用しているセッターとしてのIBActions。

実際の問題は、実際にオブジェクトを作成せずにオブジェクトを宣言していることです。

PP *obj ;

int x = obj.fNum;
NSLog(@"Happines %d",x); //Prints 0

しかし、真剣に、これは問題ではありません-本当の問題は、このコードで何が間違っているのかを知るのに十分なObjective-C言語を知らないということです、そしてそれは修正する必要がある本当に問題です。

于 2012-09-02T11:46:03.123 に答える