-5

質問があります。何かわからないと思います。

変数とメソッドを含むクラスを取得しました。

  • AppDelegate.h/.m
  • WifMon.h./m <-- 上記のもの
  • ViewController.h./m

そこで、ViewController.m に WifMon のインスタンスを作成します (WifMon のヘッダーが含まれています。

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    WifMon *test = [[WifMon alloc] initWithData:"google.de" withPort:443];
}

いいえ、ボタンを取得したので、「dynCheck」メソッドを開始したいと思います。

- (IBAction)startCheck:(id)sender {
    //start dynCheck here
    [test dynCheck];       //this isn't working
}

しかし、これは機能していません。アクション メソッド内の「テスト」インスタンスにアクセスできません。

しかし、なぜ?

4

2 に答える 2

1

C で変数を宣言すると、宣言されたスコープ内にのみ存在します。関数内で宣言すると、その関数内にのみ存在します。

testオブジェクトのすべてのインスタンス メソッドからアクセスできるようにする場合は、クラスでインスタンス変数として宣言する必要があります。

@interface ViewController : UIViewController {
    WifMon *test;
}

その後test、オブジェクトのすべてのインスタンス メソッドで使用できるようになります。

または、インスタンス変数に他のオブジェクトからアクセスできるようにしたい場合、または を使用してアクセスできるようにしたい場合は、次のself.testように宣言できます。

@interface ViewController : UIViewController

@property (strong) WifMon *test;

...

@end

その後、 を使用してアクセスできますself.test

この例では ARC を使用していることに注意してください (デフォルトで有効になっているため、おそらく既に使用しているはずです)。そうでない場合は、プロパティを のretain代わりにとして宣言し、メソッドでstrongreleasetestすることを忘れないでくださいdealloc

于 2013-06-03T11:30:46.753 に答える
1

変数のスコープは、メソッドtest内でのみ有効です。viewDidLoad

これを克服するには、たとえばインスタンス変数が必要です。周辺の物件の方が良いでしょうtest

@interface ViewController ()

@property (nonatomic, strong) WifMon* test;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.test = [[WifMon alloc] initWithData:"google.de" withPort:443];
}

- (IBAction)startCheck:(id)sender
{
    //start dynCheck here
    [self.test dynCheck];
}

ARC を使用しない場合は注意してください!!! そうでない場合は、

self.test = [[[WifMon alloc] initWithData:"google.de" withPort:443] autorelease];

- (void)dealloc
{
    [super dealloc];

    [_test release];
}
于 2013-06-03T11:31:30.853 に答える