【问题标题】:iPhone SDK: How/when should I release a UITableView delegate object?iPhone SDK:我应该如何/何时发布 UITableView 委托对象?
【发布时间】:2009-11-08 17:17:53
【问题描述】:

我在 UITableView 上使用自定义类作为委托和数据源。我正在我的 viewDidLoad 方法中做(类似的事情):

MyClass *myObject = [[MyClass alloc] init];
tableViewOutlet.delegate = myObject;
tableViewOutlet.dataSource = myObject;

我肯定需要在某处减少 myObject 的保留计数吗?但是在这里调用 [myObject release] 会产生非常糟糕的结果 - 委托在表完成其工作之前就被销毁了。

我试过了

MyClass *myObject = [[[MyClass alloc] init] autorelease];

但它也有可怕的后果。

我这里有内存泄漏吗?如果是这样,我如何以及何时安全地释放委托?

【问题讨论】:

    标签: iphone uitableview autorelease


    【解决方案1】:

    你的接口文件:

    @interface SomeClass: NSObject {
        MyClass *myObject;
    }
    @property (nonatomic,retain) MyClass *myObject;
    
    @end
    

    你的实现文件:

    @implementation SomeClass
    @synthesize myObject;
    
    -(void)dealloc {
        // if you want to be safe, change tableViewOutlet properties...
        // tableViewOutlet.delegate = nil;
        // tableViewOutlet.dataSource = nil;
        [myObject release]; // retain = 0
        [super dealloc];
    }
    ...
    MyClass *obj = [[MyClass alloc] init]; // retain = 1
    self.myObject = obj; // retain  = 2
    
    // NOTE: if you instead write: myObject = obj; **NO** retain msg will be sent.
    // *not* what you want in this context.
    tableViewOutlet.delegate = obj; // assign, so retain =2 
    tableViewOutlet.dataSource = obj;  // assign, so retain = 2
    [obj release]; // retain = 1
    ...
    
    @end
    

    【讨论】:

      【解决方案2】:

      通过在@interface.h 文件)中声明 myObject 来创建实例变量,然后调用...

      [myObject release];
      

      .. 在您的 dealloc 方法中。

      【讨论】:

        猜你喜欢
        • 2023-04-11
        • 1970-01-01
        • 1970-01-01
        • 2012-01-01
        • 2018-11-11
        • 2011-01-19
        • 2013-12-20
        • 2014-05-14
        • 1970-01-01
        相关资源
        最近更新 更多