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

Ios 使用和重用某些对象(UIView的子类),ios,objective-c,memory,memory-management,Ios,Objective C,Memory,Memory Management,从记忆的角度来看,我想知道我所做的是否正确。 首先,我要重用的文件是UIViews的子类。 在myUIViewcontroller中,我声明了如下对象: World\u 1\u ViewController.h: #import "Level1.h" @class Level1; @interface World_1_ViewController : UIViewController <UIAccelerometerDelegate> { Some things....

从记忆的角度来看,我想知道我所做的是否正确。 首先,我要重用的文件是
UIViews
的子类。 在my
UIViewcontroller
中,我声明了如下对象:

World\u 1\u ViewController.h:

#import "Level1.h"

@class Level1;

@interface World_1_ViewController : UIViewController <UIAccelerometerDelegate>
{
    Some things....
    Level1 * level1view;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

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

    //Other things...
}
- (void)dealloc
{
   [level1view release];
   [super dealloc];
}

- (void)didReciveMemoryWarning
{
    [super didReciveMemoryWarning];
    if (!self.isViewLoaded) {
        [level1view release];
         level1view = nil;
    }
}
viewDidLoad
方法中,当
UIViewController
World\u 1\u ViewController
打开时,您可以看到这是第一次初始化

现在我需要重新使用这个对象,
level1view
,因此在后面的一个方法中,我使用:

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

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

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

- (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...
}
在该代码中,还应该从superView中删除当前视图,如下所示

[level1view removeFromSuperview];
[level1view release];
level1view = [[Level1 alloc] init];
[self.view addSubview:level1view];
Some methods...
您还应该在
dealloc
direceivememorywarning
方法中发布level1view, 并将其设置为
nil

更新:

#import "Level1.h"

@class Level1;

@interface World_1_ViewController : UIViewController <UIAccelerometerDelegate>
{
    Some things....
    Level1 * level1view;
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

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

    //Other things...
}
- (void)dealloc
{
   [level1view release];
   [super dealloc];
}

- (void)didReciveMemoryWarning
{
    [super didReciveMemoryWarning];
    if (!self.isViewLoaded) {
        [level1view release];
         level1view = nil;
    }
}

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


像这样试试

我想你需要申报这样的财产

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

@property (nonatomic,strong) Level1 * level1view;
printf("%d\n", [_level1view retainCount]);

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

I放入[level1view release];在我的World_1_ViewController的dealloc方法中,但我会在DidReceiveMemoryWarning方法(甚至在一般情况下)中添加什么?我将什么设置为零?所以我应该像这样放置我的所有对象:[level1view release];level1view=nil;如果(!self.isViewLoaded)?不是所有对象,只有一些视图,请阅读,当我添加[level1view removeFromSuperview];:(您是否在viewdidLoad中发布了level1view?那么您同意另一个答案?=)您想要一次level1view(在xib中表示一个level1view)还是level1view的多个实例(在xib中有多个视图)?我不使用xib,而是使用一个level1view,然后重新使用它,但当第一个没有使用时,我想你不需要释放和分配再次,因为一旦你分配了,你可以重用该对象。但是[self.view addSubview:level1view];将继续添加level1view的实例,因此请确保使用[level1view removeFromSuperview];在这种情况下,@Bhargavi一个视图只能有一个superview,因此多次调用addSubview将不会向该视图添加多个实例。您不应该使用retainCount:
retainCount
永远不能返回0。什么应该是_sharedMySingleton?谢谢=)因此,当我重新使用level1view时,我不必输入:level1view=[level1view removeFromSuperview];或[level1view release];?[level1view release];无需使用,但level1view=[level1view removeFromSuperview];您需要根据自己的目的使用。并且需要使用DidReceiveMemoryWarning方法中的某些内容?@User205709-无需在那里处理任何事情。