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リリースしなくても、 で宣言playerしているため、からアクセスすることはできませんviewDidLoadのインスタンス内のすべてのメソッドで使用できるようにする場合は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 関数で文字を初期化すると、実際には文字の 2 番目のインスタンスが作成されます。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 に答える