首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >点表示法、释放法和去限法

点表示法、释放法和去限法
EN

Stack Overflow用户
提问于 2011-05-16 15:54:06
回答 3查看 511关注 0票数 0

@接口:

代码语言:javascript
复制
UIImageView *myImageView;

@property (nonatomic, retain) UIImageView *myImageView;

@实施:

代码语言:javascript
复制
@synthesize myImageView;

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
}

myImageView的参考计数是多少?2 (1来自alloc,1来自点符号保留)或3 (1来自alloc,1来自点标记保留,1来自@属性保留)

这两条语句有相同的引用计数吗?

代码语言:javascript
复制
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

代码语言:javascript
复制
myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];

另外,我假设您在@implemenation和dealloc方法中释放它们,对吗?

编辑:

我没有得到我想要的答案,也许我的问题含糊不清。我理解什么点符号,“属性”,“合成”,以及setter和getter是如何工作的。我不明白在使用“自我”时会发生什么。没有“自我”关于留用计数。实际上,我在retainCount对象上运行了myImageView方法,它确认了我原来的“self”。case的保留数为2次(同时保留了alloc和property,因此使用自动释放可能是个好主意)。这就引出了另一个问题,如果我不使用自动发布,我该怎么做呢?在viewDidLoad中发布一次,在dealloc中再发布一次,仍然会导致内存泄漏,对吗?

代码语言:javascript
复制
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count dot: %d", [myImageView retainCount]);

2011年-05-17 10:01:14.915测试1249:207保留计数点:2

代码语言:javascript
复制
myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
NSLog(@"retain count: %d", [myImageView retainCount]);

2011年-05-17 10:03:14.715测试1278:207保留计数:1

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-16 16:01:39

首先:你不应该对引用计数做任何假设。这充其量只能是误导。

如果您使用属性访问(self.myImageView = ...),那么它将自动保留,因此您将在viewDidLoad中泄漏UIImageView。你应该用这样的方法

代码语言:javascript
复制
self.myImageView = [[[UIMageView alloc] init.... ] autorelease];

最后一个示例(没有“点”访问)将直接修改ivar,因此它不会泄漏这个新实例。但是如果你以前不释放它的话,它会泄露你覆盖的旧imageView。

我强烈建议随时使用属性访问。别忘了清理垃圾:

代码语言:javascript
复制
[myImageView release], myImageView = nil;

有些人更喜欢self.myImageView = nil;,但这可能有副作用。

票数 2
EN

Stack Overflow用户

发布于 2011-05-16 15:58:53

不,他们不一样。第一个是“保留”,因此增加了引用计数。因此,要么首先将其赋值给临时变量,然后发布(在第一种情况下),要么添加“自动释放”并离开w/o临时变量,或者在第二种情况下检查是否已经分配了imageView (如果有-释放)。

票数 1
EN

Stack Overflow用户

发布于 2011-05-16 16:05:17

为了增加第一个答案,点符号设置器负责释放旧对象和保留新对象所涉及的内存管理。在第二种情况下,您的手上可能会有一个巨大的潜在内存泄漏,因为每次调用它,保留值就会增加1,而点符号设置器的情况则不是这样。

但是,由于它保留了对象,所以确实需要释放原始分配。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6019973

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档