0

我熟悉 OOP,因为我已经用 Java 编码了一段时间,但是我在 Objective-C 中遇到了(语法?)问题。我一直在看这里的其他帖子,但到目前为止没有任何帮助。

我有一个名为“Play_Name.m”的类,它有一个通过触摸按钮设置玩家名称的方法和另一个获取名称并返回字符串的方法,(NSString*)get_name。我还有另一个名为“Play_ChooseChar.m”的类,它应该显示通过调用 get_name 函数输入的名称。

当我在“Play_Name”(它的所有者)中调用它时,get_name 返回正确的名称,但是当我在“Play_ChooseChar”中调用它时,它返回(null)。

//Play_Name code below

#import "Play_Name.h"

@interface Play_Name ()

@end

@implementation Play_Name

@synthesize playerName;
@synthesize textName;


-(IBAction)set:(id)sender {

[self setPlayerName:(self.textName.text)];

if([self.textName.text length] <= 0) {
    playerName = @"Player";
    NSLog(@"YOUR NAME: %@", playerName);
}

NSLog(@"YOUR NAME: %@", playerName);

}

//...........

@end





//Play_ChooseChar code below

#import "Play_ChooseChar.h"
#import "Play_Name.h"

@interface Play_ChooseChar ()

@end

@implementation Play_ChooseChar

@synthesize display_name;
@synthesize playname;
@synthesize boy;
@synthesize girl;
@synthesize isGirl;
@synthesize isBoy;

bool isGirl = FALSE;
bool isBoy = FALSE;

-(void)theName {

Play_Name *pN = [[Play_Name alloc] init];
[pN setPlayerName: pN.playerName];
NSLog(@"NAME: %@", pN.playerName);

self.display_name.text = pN.playerName;
//display_name.text = @"test";

[pN release];

//............

@end

因此,当我运行它并输入我的名字时,“Play_ChooseChar”中的打印语句返回“NAME: (null)”

4

4 回答 4

2

开幕演讲:您似乎在抛开 Objective-C 约定。Getters 不应该指得到的行为——所以你应该实现name,而不是get_name你会看到的几乎唯一的动词是 'is',在isValidala的意义上NSTimer。Objective-C 也使用驼峰式大小写,以小写字符开头,所以player_name应该是playerName. 类似地,你的类应该有一个三个字母的前缀(因为 Objective-C 不做命名空间)并且也是驼峰式的,例如ATPPlayName.

抛开讲座要点,这个:

Play_Name *play_name = [[Play_Name alloc] init];

创建一个全新的Play_Name. 它与您在其他地方使用的任何实例都不相同。该实例尚未附加名称。所以当你在下一行询问它的名字时,它是nil.

于 2012-11-26T06:17:29.257 回答
0

您还没有真正显示足够的代码来确定问题。但是,我建议使用属性而不是遵循您自己的命名约定的方法。例如:

@interface Player: NSObject
@property NSString* name;
@property NSString* character;
@end

上面定义了一个Player具有属性name和的类character。Xcode 将生成“支持”这些属性的适当访问器方法和实例变量。有关详细信息,请参阅语言参考。

于 2012-11-26T06:18:02.050 回答
0

您应该创建属性,xcode 会自动为您创建 getter 和 setter。

看看这里:

于 2012-11-26T06:18:47.033 回答
0

抛开设计和代码约定:当你创建一个新的 Play_Name 实例时,它的 get_name 显然将返回 nil,因为在代码中没有任何地方在调用 get_name 之前调用了 set_name。

你应该首先做:[play_name set_name:@"john"];

并且,假设您的 set_name 方法正确实现, [play_name get_name] 应该返回正确的值。

我支持其他建议使用属性的人,因为它可以为您处理大多数内存管理的细微差别。您可以在此处阅读有关此内容的更多信息: Objective-C:声明的属性

于 2012-11-26T06:33:30.440 回答