使用和重用一些对象(UIView的子类)

时间:2013-03-22 09:18:56

标签: ios objective-c memory memory-management

我想从记忆的角度来看,如果我正在做的事情是正确的。 首先,我想重用的文件是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 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分: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...
}

答案 2 :(得分:0)

使用singleton方法创建处理内存使用的实例,如下所示

   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];

试试这样。

答案 3 :(得分:-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时,必须释放该对象。