![](/img/trans.png)
[英]Retain/Release with stringByReplacingCharactersInRange Question
[英]Basic question on retain/release semantics from Apple's reference library
我早在什么时候就完成了Objective-C,最近(也就是现在)已经阅读了Apple网站上有关retain
和release
的文档。 但是,他们的“ 创建iPhone应用程序”页面中有一些代码让我有些困惑:
- (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
指向它,所以现在不指向已释放的内存并引起问题吗?
我已经完成了Objective-C的工作,
嗨,Obj-C同时介绍了属性的(邪恶)概念。 注意
self.placardView=xxx;
和
self->placardView=xxx;
是不同的。 根据定义,前者调用[self setPlacardView:xxx]
而后者只是将xxx
分配给成员。 现在,当您查看MoveMeView.h时 ,您将看到以下行
@property (nonatomic, retain) PlacardView *placardView;
@synthesize placardView;
这些命令告诉编译器使用标准的保留/释放语义来适当地生成-setPlacardView:
和placardView
。 有关更多详细信息,请参阅Apple的属性文档。
需要指出的几件事;
如果将placardView属性定义为保留(@property(retain)...),则self.placardView将调用由编译器生成的setter,其中将包含保留。
以防万一这对您来说是新事物,属性和关联的@synthesize告诉编译器生成- (void)setPlacardView:(UIView *)view
和- (UIView *)placardView
方法。
另一件事要注意; addSubview:保留给定的视图。 因此,如果没有发布,则视图的保留计数为2。释放并添加为子视图后,保留计数为1。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.