我有一个问题。我想我不会说些什么。
我得到了一个类,包含变量和方法。
所以现在我在我的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”实例。
但为什么?
答案 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];
}