【发布时间】:2011-08-26 13:44:30
【问题描述】:
@接口:
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 保留)
这两个语句的引用计数是否相同?
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”时会发生什么。并且没有“自我”。关于保留计数。我实际上在 myImageView 对象上运行了 retainCount 方法,它确认了我原来的“自我”。 case 的保留计数为两个(使用 alloc 和 property 保留,因此在那里使用 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
【问题讨论】:
-
不要将保留计数视为绝对值;将它们视为三角洲。 IE。 “
alloc产生一个引用计数 +1 的对象”、“self.myImageView = aView将引用计数加一”、“release将保留计数减一”..... -
@bbum,理解,但我想了解的是直接使用属性评估器和 ivar 时的区别。我是否仍然需要在 viewDidLoad 中释放两者(因为我在那里分配),并在 dealloc 中再次释放它,因为它是一个保留属性。
-
计算您造成的保留,并通过发布来平衡每个保留;
+alloc是一个,通过 setter 分配给属性是另一个......所以,是的,您需要两个版本或自动释放。就是这么简单;如果你保留,你必须释放。 -
所以对于使用@property评估器的第二种情况,我必须释放它两次,一次在viewDidLoad中用于+alloc并在dealloc中释放用于保留?第一个案例呢?
标签: ios objective-c memory-management