对象释放问题

时间:2011-07-04 00:21:06

标签: objective-c ios memory-management dealloc

我有一个代码:

@interface PhotoListViewController : UIViewController 
{
    IBOutlet UIImageView* firstPicContainer;
    IBOutlet UIImageView* secondPicContainer;
    UIImage* pic_one;
    UIImage* pic_two;
    IBOutlet UILabel* firstPicLabel;
    IBOutlet UILabel* secondPicLabel;
    NSString* firstPicName;
    NSString* secondPicName;
    IBOutlet UILabel* authorLabelA;
    IBOutlet UILabel* authorLabelB;
    NSString* authorName;

}
@property (retain) UIImage* pic_one;
@property (retain) UIImage* pic_two;
@property (copy) NSString* firstPicName;
@property (copy) NSString* secondPicName;
@property (copy) NSString* authorName;


@end

问题是:我应该释放整个对象还是那些我声明了属性的对象? 例如:firstPicName是NSString并保留,当设置时,其容器是UILabel * firstPicLabel,其分配如下:

firstPicLabel.text = firstPicName;

在-viewDidLoad中。因此,作为对象的标签本身不会保留,其属性也是如此。同样的事情是与其他对象,属性被保留,其他只是一个容器。这些容器的拥有者是他们的视图,应该负责他们的释放,但我在这里有点困惑,所以我想澄清这一点。 感谢。

2 个答案:

答案 0 :(得分:1)

简短回答:对于您声明为retain(或copy)的任何媒体资源,您应该在nil方法中将其值设置为dealloc。在您不自行保留的其他对象和字段上声明的属性,您无需担心。

答案 1 :(得分:1)

您的界面永远不会提供有关您应该或不应该发布的内容的足够信息(但它会提供线索)。

你可以拥有上面声明的所有ivars和属性,但是如果你没有初始化它们和/或访问它们的属性,那么首先永远不会有一个对象要发布。

经验法则是:

1)如果您创建,复制或保留对象,则您有责任将其发布。

2)请参阅上面的规则#1。

在实践中,这里有一些例子:

@implementation...
...
pic_one = [UIImage imageNamed:@"test.png"];
...
@end

pic_one被声明为ivar但被分配给自动释放的对象。你不必发布它。

另一个例子:

@implementation....
...
self.pic_one = [UIImage imageNamed:@"test.png"];
...
@end

您通过其评估者/属性(已声明为保留)分配了此UIImage对象,因此您负责释放它。 “在幕后”,这是通过其属性分配对象时发生的事情(例如,对于声明为retain的属性,copy将略有不同但原理相同)。

- (void)setPic_One:(UIImage*)newImage
{
   if (pic_One != newImage)
   {
        [newImage retain];
        [pic_One release];
        pic_One = newImage;
   }
}

最后一个:

UIImage *testImage = [[UIImage alloc] initWithImage:@"test.png"];
self.pic_one = testImage;
[testImage release];

在这种情况下,您正在分配/初始化(创建)UIImage对象,因此您负责释放它。同时你也将它分配给一个声明为retain的属性,所以当你完成它时你也有责任释放它(通常在你的dealloc方法中)。