关于Apple参考库中保留/释放语义的基本问题

时间:2010-04-11 18:23:18

标签: iphone objective-c memory-management

我已经完成了Objective-C的方式,并且最近(即刚刚)阅读了Apple网站上有关retainrelease使用的文档。但是,他们的Creating an iPhone Application页面中有一些代码让我感到有些困惑:

- (void)setUpPlacardView
{
    // Create the placard view -- it calculates its own frame based on its image.
    PlacardView *aPlacardView = [[PlacardView alloc] init];
    self.placardView = aPlacardView;
    [aPlacardView release];  // What effect does this have on self.placardView?!
    placardView.center = self.center;
    [self addSubview:placardView];
}

没有看到整个班级,似乎self.placardView也是PlacardView *,并且将其分配给aPlacardView似乎并不表示它会保留对它的引用。因此,在我看来,我评论过的行([aPlacardView release];)可能导致aPlacardView保留计数为0,从而被释放。由于self.placardView指向它,现在不会指向解除分配的内存并导致问题吗?

2 个答案:

答案 0 :(得分:3)

  

我做了Objective-C的时候,

嗨,Obj-C同时介绍了属性的(邪恶)概念。注意

 self.placardView=xxx;

 self->placardView=xxx;

是不同的。根据定义,前者调用[self setPlacardView:xxx],而后者只是将xxx分配给成员。 现在,当您查看MoveMeView.h时,您会看到

@property (nonatomic, retain) PlacardView *placardView;

MoveMeView.m

@synthesize placardView;

这些告诉编译器使用标准的retain / release语义适当地生成-setPlacardView:placardView。有关更多详细信息,请参阅Apple的properties文档。

答案 1 :(得分:1)

要指出一些事情;

如果属性placardView被定义为被保留(@property(retain)...)那么self.placardView将调用编译器生成的setter,其中包含一个retain。

只是这对你来说是新的,属性和相关的@synthesize告诉编译器生成- (void)setPlacardView:(UIView *)view- (UIView *)placardView方法。

另一件需要注意的事情; addSubview:保留它给出的视图。因此,如果没有发布,视图的保留计数为2.释放然后添加为子视图会使保留计数为1.