在按钮操作方法中运行实例方法

时间:2013-06-03 11:25:34

标签: ios objective-c

我有一个问题。我想我不会说些什么。

我得到了一个类,包含变量和方法。

  • 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
}

但这不起作用。 我无法访问action方法中的“test”实例。

但为什么?

2 个答案:

答案 0 :(得分:1)

在C中声明变量时,它仅存在于声明它的范围中。如果在函数内声明它,它只存在在函数内

如果您希望能够从所有对象的实例方法访问它,则需要在类中声明test作为实例变量:

@interface ViewController : UIViewController {
    WifMon *test;
}

然后test将在对象的所有实例方法中可用。

或者,如果您希望其他对象可以访问实例变量,或者能够使用self.test访问它,则可以这样声明:

@interface ViewController : UIViewController

@property (strong) WifMon *test;

...

@end

然后您可以使用self.test访问它。

请注意,此示例使用ARC(默认情况下已启用,因此您可能已在使用它),但如果不是,则需要将属性声明为retain而不是{{1 ,并记住在strong方法中发布test

答案 1 :(得分: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];
}