gpt4 book ai didi

ios - 圆点表示法、释放和解除分配

转载 作者:行者123 更新时间:2023-11-28 20:46:21 25 4
gpt4 key购买 nike

@界面:

UIImageView *myImageView;

@property (nonatomic, retain) UIImageView *myImageView;

@实现:

@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 个来自@property retain)

这两个语句的引用计数是否相同?

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

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

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


编辑:

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

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

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

最佳答案

首先:您不应该对引用计数做出任何假设。充其量只会产生误导。

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

self.myImageView = [[[UIMageView alloc] init.... ] autorelease];

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

我强烈建议始终使用属性访问。并且不要忘记在 dealloc 中进行清理:

[myImageView release], myImageView = nil;

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

关于ios - 圆点表示法、释放和解除分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6019973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com