我已经完成了Objective-C的方式,并且最近(即刚刚)阅读了Apple网站上有关retain
和release
使用的文档。但是,他们的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
指向它,现在不会指向解除分配的内存并导致问题吗?
答案 0 :(得分:3)
我做了Objective-C的时候,
嗨,Obj-C同时介绍了属性的(邪恶)概念。注意
self.placardView=xxx;
和
self->placardView=xxx;
是不同的。根据定义,前者调用[self setPlacardView:xxx]
,而后者只是将xxx
分配给成员。
现在,当您查看MoveMeView.h时,您会看到
@property (nonatomic, retain) PlacardView *placardView;
@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.