【问题标题】:Use and re-use some objects (Subclass of UIView)使用和重用一些对象(UIView 的子类)
【发布时间】:2013-03-12 02:12:18
【问题描述】:

从记忆的角度来看,我想知道我所做的是否正确。 首先,我要重用的文件是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...

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

【问题讨论】:

    标签: ios objective-c memory memory-management


    【解决方案1】:

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

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

    试试这样。

    【讨论】:

    • 什么应该是 _sharedMySingleton ?
    • 谢谢 =) 所以当我重新使用 level1view 时,我不必输入: level1view = [level1view removeFromSuperview];或 [level1view 发布]; ?
    • [level1view 发布];没必要用,但是level1view = [level1view removeFromSuperview];你需要根据你的目的使用。
    • 并且需要在 didReciveMemoryWarning 方法中添加一些东西?
    • @user2057209 - 无需在那里处理任何事情。
    【解决方案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时,该对象必须被释放。

    【讨论】:

    【解决方案3】:
    [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;
        }
    }
    

    【讨论】:

    • 我把[level1view release];在我的 World_1_ViewController 的 dealloc 方法中,但我会在 didReciveMemoryWarning 方法中添加什么(甚至一般情况下?)?我会将什么设置为 nil ?
    • 所以我应该把我所有的对象都像这样:[level1view release]; level1view = 无;在 if (!self.isViewLoaded) 之后?
    • 不是所有对象,只有一些视图,阅读 stackoverflow.com/questions/2430728/…stackoverflow.com/questions/921360/…
    • 当我添加 [level1view removeFromSuperview] 时看起来不起作用; :(
    • 你在viewdidLoad中释放level1view吗?
    【解决方案4】:

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

    - (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...
    }
    

    【讨论】:

    • 所以你同意另一个答案? =)
    • 你想只有一次level1view(意思是xib中的一个level1view)还是level1view的多个实例(xib中的多个view)?
    • 我不使用xib,而是一个level1view,之后再使用,但是当第一个肯定不使用时
    • 我猜你不需要再次释放和分配,因为一旦你分配了你就可以重用那个对象。但是 [self.view addSubview:level1view];将继续添加 level1view 的实例,因此请确保使用 [level1view removeFromSuperview];在这种情况下。
    • @Bhargavi 一个视图只能有一个超级视图,因此多次调用 addSubview 并不会向视图添加多个实例。
    猜你喜欢
    • 2015-08-28
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多