2010-04-11 20 views
0

我已经完成了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指向它,现在不会指向释放内存并导致问题吗?

回答

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; 

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

+0

属性的概念并不邪恶,它是Apple引入的点符号时间。它污染了语法并导致无尽的混淆。就我个人而言,我使用很多属性,但我使用普通的Objective-C语法来获取和设置它们。 – JeremyP 2010-04-11 19:22:21

+0

是的,我同意这一点。这就是为什么我在邪恶一词前面加上括号。对我来说,点符号完全可以;我总是提醒自己,这些都是方法调用。但我衷心地认为这对初学者来说是一个很大的混乱。 – Yuji 2010-04-11 22:27:41

1

两件事情要指出;

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

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

另一件需要注意的事项; addSubview:保留给定的视图。因此,如果没有该版本,该视图的保留计数为2.发布并随后添加为子视图会使您保留计数为1.