0

TabViewcontroller の仕組みについて練習しています。これで、UIViewcontroller の 2 つのサブクラスができました。1 つは HypnosisViewController で、もう 1 つは TimeViewController です。私が確認したかったのは、IOSシミュレーターがメモリ警告を受け取ったときに-(void)viewDidLoadがどのように機能するかです。そして、私はしました

  1. アプリのビルドと実行
  2. コンソールには、「HypnosisViewcontroller がそのビューをロードしました」と表示されました。
  3. 別のタブ(TimeViewController)に切り替えました
  4. コンソールでメッセージを見ました。「TabViewcontrollerがそのビューをロードしました」と表示されます
  5. IOSシミュレーターでシミュレーターメモリ警告コマンドを実行しました
  6. コンソールに「HypnoTime Received memory warning」と表示されました。
  7. HypnosisViewcontroller に切り替えて、コンソールに「HypnosisViewcontroller がそのビューをロードしました」と表示されるかどうかを確認します。また。

ここでの問題は、HypnosisViewcontroller が破棄されず、再作成されないことです。(HypnosisViewcontroller に切り替えたときにログ メッセージが表示されないためです。)ただし、画面に表示されていないビューは、メモリ警告中に破棄されるはずです。

私は何か見落としてますか?前もって感謝します!

HypnosisViewController.m:

#import "HypnosisViewController.h"
#import "HypnosisView.h"

@implementation HypnosisViewController

-(void)loadView
{
    //Create a view

    CGRect frame = [[UIScreen mainScreen] bounds];
    HypnosisView *v = [[HypnosisView alloc] initWithFrame:frame];

    // Set it as *the* view of this view controller
    [self setView:v];


}

-(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{

    self = [super initWithNibName:nil
                           bundle:nil];

    if(self){
        //Get the tab bar item
        UITabBarItem *tbi = [self tabBarItem];

        //Give it a label
        [tbi setTitle:@"Hypnosis"];

        //Create a UIImage from a file
        //This will use Hypno@2x.png on retina display devices
        UIImage *i = [UIImage imageNamed:@"Hypno.png"];

        // Put that image on the tab bar item
        [tbi setImage:i];

    }
    return self;

}

-(void)viewDidLoad
{

    // Always call the super implmetaion of viewDidload
    [super viewDidLoad];
    NSLog(@"HypnosisViewcontroller loaded its view");


}

@end

TimeViewController.m:

#import "TimeViewController.h"

@implementation TimeViewController

-(IBAction)showCurrentTime:(id)sender
{
    NSDate *now = [NSDate date];

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setTimeStyle:NSDateFormatterMediumStyle];


    [timeLabel setText:[formatter stringFromDate:now]];
    [timeLabel2 setText:[formatter stringFromDate:now]];

}

-(id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle
{
    // Call the superclass's designated initializer
   self = [super initWithNibName:nil
                          bundle:nil];

    //Get a pointer to the application bundle object
   // NSBundle *appBundle = [NSBundle mainBundle];

   // self = [super initWithNibName:@"TimeViewController"
                           //bundle:appBundle];

    if(self){
        //Get the tab bar item
        UITabBarItem *tbi = [self tabBarItem];

        //Give it a label
        [tbi setTitle:@"Time"];


        //Create a UIImage from a file
        //This will use Time@2x.png on retina display devices
        UIImage *i = [UIImage imageNamed:@"Time.png"];

        // Put that image on the tab bar item
        [tbi setImage:i];




    }
    return self;
}

-(void)viewDidLoad
{

    // Always call the super implmetaion of viewDidload
    [super viewDidLoad];
    NSLog(@"TimeViewcontroller loaded its view");

   // [[self view] setBackgroundColor:[UIColor greenColor]];


}

@end

ここに画像の説明を入力ここに画像の説明を入力

4

2 に答える 2

1

メモリの警告によって、コントローラーがビューを破棄/アンロードすることはなくなりました。

于 2013-12-11T09:20:03.500 に答える
0

正常に動作しています。そして、すべてのビューが開始されたときにのみ呼び出されるHypnosisViewcontrollerため、破棄されて再度作成されました。そのため、メモリから消去されて再度開始された表現にviewDidLoad戻ると、ログ メッセージが再び表示されます。メモリの警告をシミュレートせずに、これら 2 つのビュー コントローラーを切り替えてみると、ログ メッセージが 1 回だけ表示されます。HypnosisViewcontrollerHypnosisViewcontroller

于 2013-12-11T08:07:12.933 に答える