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
的子类。
在myUIViewcontroller
中,我声明了如下对象:
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-无需在那里处理任何事情。