代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

分配/保留模型(mvc)?

  •  0
  • fuzzygoat  · 技术社区  · 15 年前

    [[self dataModel] doSomething]; 它创建一个新的(或重用一个现有的)对象。我特别关心的是设置属性和正确发布本地alloc,任何评论将非常感谢。

    // INTERFACE
    DataModel *dataModel;
    @property(nonatomic, retain) DataModel *dataModel; 
    
    // IMPLEMENTATION
    @synthesize dataModel;
    
    // Lazy Instanciation ...
    - (DataModel *)model {
        if(!dataModel) {
            DataModel *tempDataModel = [[DataModel alloc] init];
            [self setDataModel:tempDataModel;
            [tempDataModel release]; 
        } 
        return dataModel;
    } 
    
    // Clean up
    - (void)dealloc {
    [dataModel release];
    [super dealloc];
    }
    

    或者:(虽然我不太喜欢这个,因为它看起来让我困惑)

    // Lazy Instanciation ...
    - (DataModel *)model {
        if(!dataModel) {
            [self setDataModel:[[DataModel alloc] init]];
            [dataModel release];
        } 
        return dataModel;
    } 
    

    加里。

    3 回复  |  直到 15 年前
        1
  •  1
  •   Alex Wayne    15 年前

    第一个比较好,比较标准,比较合适。第二种形式是一般的坏形式。因为完全不清楚你的目标 init release . 最好这样想:

    instiate object
    do something with object
    release object
    

    setDataModel: 方法之后对象会发生什么。

    但就我个人而言,我更喜欢 autorelease 在大多数情况下。只是因为你不必想太多。

    DataModel *tempDataModel = [[[DataModel alloc] init] autorelease];
    [self setDataModel:tempDataModel];
    

    instantiate and autorelease object
    do something with object
    

    但这是一个品味问题,很多人更喜欢直白的 释放

        2
  •  1
  •   walkytalky    15 年前

    第一种方法更清楚,尽管效果是一样的。但是请注意,如果 dataModel 属性并使用访问器的 retain 机制是将所有这些放在一个地方,直接使用 数据模型 ivar正在破坏这种封装。

    实际上,这两者之间似乎有点混淆 model 方法和 数据模型 访问器本身,避免了这种稍微尴尬的重定向:

    - (DataModel*) dataModel
    {
        if ( ! dataModel )
        {
            // direct ivar access is legit inside the accessor itself
            // (at least, I would say so -- no doubt others will disagree!)
            dataModel = [[DataModel alloc] init];
        }
    
        return dataModel;
    }
    
        3
  •  1
  •   Jay Haase    15 年前

    您可以考虑重写数据模型合成getter。否则,它可能与dataModel getter和模型消息都有点混淆。

    我想你可以这样覆盖你的合成吸气剂:

    - (DataModel *)dataModel {
        if(!dataModel) {
            dataModel = [[DataModel alloc] init];
        } 
        return dataModel;
    }