0

成员、学者、代码大师。我的背景与任何计算机编程都相差甚远,因此我的问题对您来说可能看起来很基本且有些微不足道。尽管如此,我似乎无法摆脱它。我已经用谷歌搜索并搜索了答案,只是让自己更加困惑。有了这个,我会请求一个简单的解释,适合像我这样的非技术人员和其他类似的人到达这个线程。

我在下面留下了一条评论,上面写着“这是问题”,指的是我的问题。

//  character.h
#import <Foundation/Foundation.h>

@interface character : NSObject {
    NSString *name;
    int hitPoints;
    int armorClass;
}

@property (nonatomic,retain) NSString *name;
@property int hitPoints,armorClass;

-(void)giveCharacterInfo;

@end


//  character.m
#import "character.h"


@implementation character
@synthesize name,hitPoints,armorClass;

-(void)giveCharacterInfo{
    NSLog(@"name:%@ HP:%i AC:%i",name,hitPoints,armorClass);
}
@end



//  ClassAtLastViewController.h
#import <UIKit/UIKit.h>

@interface ClassAtLastViewController : UIViewController {

}

-(void)callAgain;

@end



//  ClassAtLastViewController.m
#import "ClassAtLastViewController.h"
#import "character.h"

@implementation ClassAtLastViewController


- (void)viewDidLoad {
    //[super viewDidLoad];
    character *player = [[character alloc]init];
    player.name = @"Minsc";
    player.hitPoints = 140;
    player.armorClass = 10;
    [player giveCharacterInfo];
    [player release];
        // Up until here, All peachy!
    [self performSelector:@selector(callAgain) withObject:nil afterDelay:2.0];
}

-(void)callAgain{
    // Here is the issue, I assume that since I init the player again I loss everything
    // Q1. I loss all the data I set above, where is it than? 
    // Q2. What is the proper way to implement this

    character *player = [[character alloc]init];
    [player giveCharacterInfo];
}

提前非常感谢,请记住,我的背景与鲑鱼养殖比计算机代码更相关,如果对您来说都一样,请尝试将您的答案降低到我的水平。

4

2 回答 2

4

我丢失了上面设置的所有数据,它在哪里?

它已被释放(释放)。注意:

character *player = [[character alloc]init];    // You create the character here...
// And then you initialize it...
// Then later...
[player release];                               // You release it.

即使您没有释放它,您仍然无法从 访问它callAgain,因为您playerviewDidLoad. 如果您希望它可用于实例中的所有方法ClassAtLastViewController,则应使其成为实例变量。

实现这个的正确方法是什么

我不知道你的使用细节,但我想你想要这样的东西:

@interface ClassAtLastViewController : UIViewController {
    character *player;    // Make player an instance variable
}

-(void)callAgain;

@end

@implementation ClassAtLastViewController


- (void)viewDidLoad {
    //[super viewDidLoad];
    player = [[character alloc]init];    // Initialize the instance variable
    player.name = @"Minsc";
    player.hitPoints = 140;
    player.armorClass = 10;
    [player giveCharacterInfo];
    [self performSelector:@selector(callAgain) withObject:nil afterDelay:2.0];
}

-(void)callAgain{
    [player giveCharacterInfo];
}
于 2010-05-04T18:37:05.720 回答
0

当您在 callAgain 函数中初始化角色时,实际上是在创建角色的第二个实例。尽管在 callAgain 中创建的角色与您在 viewDidLoad 中创建的角色名称相同,但它是一个完全独立的变量。你在 viewDidLoad 中初始化的字符只存在于 viewDidLoad 函数的范围内。

此外,当您在 viewDidLoad 中调用 [player release] 时,您正在从内存中删除该角色实例。

我认为您想要做的是创建一个可以在整个班级中使用的实例变量:

//  ClassAtLastViewController.h
#import <UIKit/UIKit.h>

@interface ClassAtLastViewController : UIViewController {
    character *player;
}

-(void)callAgain;

@end



//  ClassAtLastViewController.m
#import "ClassAtLastViewController.h"
#import "character.h"

@implementation ClassAtLastViewController


- (void)viewDidLoad {
    //[super viewDidLoad];
    player = [[character alloc]init];
    player.name = @"Minsc";
    player.hitPoints = 140;
    player.armorClass = 10;
    [player giveCharacterInfo];

    [self performSelector:@selector(callAgain) withObject:nil afterDelay:2.0];
}

-(void)callAgain{
    // Here is the issue, I assume that since I init the player again I loss everything
    // Q1. I loss all the data I set above, where is it than? 
    // Q2. What is the proper way to implement this

    [player giveCharacterInfo];
}
于 2010-05-04T18:39:46.907 回答