0

从记忆的角度来看,我想知道我所做的是否正确。首先,我要重用的文件是UIViews. 在我的UIViewcontroller中,我声明了一个这样的对象:

World_1_ViewController.h :

#import "Level1.h"

@class Level1;

@interface World_1_ViewController : UIViewController <UIAccelerometerDelegate>
{
    Some things....
    Level1 * level1view;
}

World_1_ViewController.m :

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    level1view = [[Level1 alloc] init];
    [self.view addSubview:level1view];

    //Other things...
}

您可以在方法中看到它是第一次在UIViewController World_1_ViewController打开时初始化viewDidLoad

现在我需要重新使用这个对象,level1view所以在我之后的一个方法中,我使用:

[level1view release];
level1view = [[Level1 alloc] init];
[self.view addSubview:level1view];
//Some methods...

从记忆的角度来看是正确的吗?或者我该怎么办?

4

4 回答 4

1
[level1view release];
level1view = [[Level1 alloc] init];
[self.view addSubview:level1view];
Some methods...

在该代码中,您还应该从 superView 中删除当前视图,就像这样

[level1view removeFromSuperview];
[level1view release];
level1view = [[Level1 alloc] init];
[self.view addSubview:level1view];
Some methods...

你也应该在deallocdidReciveMemoryWarning方法中释放level1view,并将其设置为nil

更新:

- (void)dealloc
{
   [level1view release];
   [super dealloc];
}

- (void)didReciveMemoryWarning
{
    [super didReciveMemoryWarning];
    if (!self.isViewLoaded) {
        [level1view release];
         level1view = nil;
    }
}
于 2013-03-22T09:27:26.447 回答
0

如果您没有参数更改并且只想多次查看相同的视图,那么只需分配一次,如下所示

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    if(level1view==nil)
         level1view = [[Level1 alloc] init];
    [self.view addSubview:level1view];

    Other things...
}
于 2013-03-22T09:25:08.350 回答
0

使用单例方法创建实例来处理这样的内存使用

   static Level1 *_sharedMySingleton;

  @implementation Level1

  +(Level1 *) getLevel1Instance
    {
        @synchronized([Level1 class])
        {
            if (!_sharedMySingleton)
            {
                _sharedMySingleton = [[self alloc] init];

            }
            return _sharedMySingleton;
        }
        return nil;
    }
@end

在创建实例时替换这个

level1view = [[Level1 alloc] init];
[self.view addSubview:level1view];

 level1view = [level1view removeFromSuperview];
level1view = [Level1 getLevel1Instance];
[self.view addSubview:level1view];

像这样试试。

于 2013-03-22T09:35:43.300 回答
-2

我认为您需要声明这样的财产。

@interface World_1_ViewController : UIViewController <UIAccelerometerDelegate>
{
    Some things....
    Level1 * level1view;
}

@property (nonatomic,strong) Level1 * level1view;

并且还使用“自我”。或“_”通过 setter 或 getter 访问变量。

如果你想检查对象是否被释放,你可以检查“retainCount”来使用“-(NSUInteger)retainCount”这样的。

printf("%d\n", [_level1view retainCount]);

当 retainCount 为 0 时,该对象必须被释放。

于 2013-03-22T09:44:26.510 回答