繁体   English   中英

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

[英]Basic question on retain/release semantics from Apple's reference library

我早在什么时候就完成了Objective-C,最近(也就是现在)已经阅读了Apple网站上有关retainrelease的文档。 但是,他们的“ 创建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;

并在MoveMeView.m中

@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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM