@接口:
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来自@属性保留)
这两条语句有相同的引用计数吗?
self.myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];和
myImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];另外,我假设您在@implemenation和dealloc方法中释放它们,对吗?
编辑:
我没有得到我想要的答案,也许我的问题含糊不清。我理解什么点符号,“属性”,“合成”,以及setter和getter是如何工作的。我不明白在使用“自我”时会发生什么。没有“自我”关于留用计数。实际上,我在retainCount对象上运行了myImageView方法,它确认了我原来的“self”。case的保留数为2次(同时保留了alloc和property,因此使用自动释放可能是个好主意)。这就引出了另一个问题,如果我不使用自动发布,我该怎么做呢?在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
发布于 2011-05-16 16:01:39
首先:你不应该对引用计数做任何假设。这充其量只能是误导。
如果您使用属性访问(self.myImageView = ...),那么它将自动保留,因此您将在viewDidLoad中泄漏UIImageView。你应该用这样的方法
self.myImageView = [[[UIMageView alloc] init.... ] autorelease];最后一个示例(没有“点”访问)将直接修改ivar,因此它不会泄漏这个新实例。但是如果你以前不释放它的话,它会泄露你覆盖的旧imageView。
我强烈建议随时使用属性访问。别忘了清理垃圾:
[myImageView release], myImageView = nil;有些人更喜欢self.myImageView = nil;,但这可能有副作用。
发布于 2011-05-16 15:58:53
不,他们不一样。第一个是“保留”,因此增加了引用计数。因此,要么首先将其赋值给临时变量,然后发布(在第一种情况下),要么添加“自动释放”并离开w/o临时变量,或者在第二种情况下检查是否已经分配了imageView (如果有-释放)。
发布于 2011-05-16 16:05:17
为了增加第一个答案,点符号设置器负责释放旧对象和保留新对象所涉及的内存管理。在第二种情况下,您的手上可能会有一个巨大的潜在内存泄漏,因为每次调用它,保留值就会增加1,而点符号设置器的情况则不是这样。
但是,由于它保留了对象,所以确实需要释放原始分配。
https://stackoverflow.com/questions/6019973
复制相似问题