从另一个 - objective-c访问类的变量值

时间:2012-02-21 02:02:20

标签: ios properties

这可能是一个愚蠢的问题,但我很难尝试解决它。问题是,有一个实现计数器的类,在它的结尾处,它调用另一个类控制的视图。我想要做的是从第二个类中访问第一类计数器的值。我将计数器定义为属性并尝试从其他类访问它但我总是将其值设为0.任何人都可以帮助我吗?

感谢。

我拥有的是:

Class1.h

@interface Class1 : CCLayerColor <UIAlertViewDelegate>
{
    int movesCounter;
}
@property int movesCounter;

@end

Class1.m

@implementation Class1
@synthesize movesCounter;

//At this point the counter gets incremented and NSLogging its value correctly

@end

Class2.m

#import Class1.h    

@implementation GameOverLayer


-(id) init
{
    if( (self=[super init]))
    {
       Class1 *theClass1 = [[Class1 alloc]init];
       NSString *message = [NSString stringWithFormat:@"It took you %d moves.",theClass1.movesCounter];
       UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:message delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

       [alert show];
       [alert release];
    }
}

我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的问题是您在Class2 init方法中创建了Class1的实例:

Class1 *theClass1 = [[Class1 alloc] init];

这个新实例除了你已经成功递增的int之外,因为它是一个新的内存片段,moveCounter的值仍然是0.你真正想要的是指向特定副本的指针您一直在使用的Class1 - 不需要或不需要alloc / init。尝试在Class2中创建一个可以保存指向Class1的指针的属性:

#import "Class1.h"

@interface Class2 : NSObject {
    Class1 *myPointerToClass1;
}
@property (nonatomic, retain) Class1 *myPointerToClass1;

当然@synthesize在Class2的.m中的myPointerToClass1。既然Class2已准备好保存指向Class1的指针,则只需填充它即可。在Class1中,在alloc和init的Class2实例的代码之后,使用如下代码:

myClass2.myPointerToClass1 = self;

为了确保我没有忘记我使用上面的代码做了所有这些,一切对我来说都很好。

<小时/> 编辑:原始答案从这里开始,但现在无关紧要..... 您提到将计数器定义为属性,但是您是否还在实现(.m)文件中合成了实例变量?

@synthesize myCounter;

这将自动为您创建setter和getter方法。另外,您是否验证过该值正在增加,可能是在viewcontroller中使用了NSLog语句?

NSLog(@"myCounter is currently equal to %d", myCounter); // assuming an int

如果涵盖了这些基础知识,也许您可​​以编辑您的问题以包含代码,向我们展示更多关于行为不端的类如何首先获得指向该变量的指针。

答案 1 :(得分:1)

在头文件中,您将iVar声明为

{
    int movesCounter;
}

但是你用

合成了这个属性
@synthesize movesCounter = _movesCounter; // note the underscore

因此movesCounter iVar未与movesCounter属性相关联。如果您仅更新movesCounter而不是self.movesCounter_movesCounter,则外部课程将无法看到这些更改。