在初始化方法中,我有以下代码
- (id)init {
self = [super init];
if (self) {
UIButton *tempButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
tempButton.frame = CGRectMake(0,0,300,44);
// some custom code...
self.myButton = tempButton;
}
return self;
}
myButton
是保留属性的位置。
我知道,对于内存管理规则而言,此方法与其他方法相同:
- (id)init {
self = [super init];
if (self) {
UIButton *tempButton = [[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)];
// some custom code...
self.myButton = tempButton;
[tempButton release];
}
return self;
}
但在这种情况下,我需要使用第一个“版本”,因为buttonType
属性是只读的,并且在按钮初始化后我无法更改它。
由于我发现自己在我的应用程序中使用多个方法的“非init-release”版本,并且对于多个对象(大多数是NSString
),我的问题是:在这种情况下不计算当tempButton
对象被释放时,赋值给保留对象的属性?也许在方法/ if语句的末尾?或者第一个“版本”是否会导致内存使用量增加,因为对象没有立即释放但是经过一段时间后会被释放?
答案 0 :(得分:1)
我认为你在这里有点困惑:在你的两个片段中,你创建了一个tempButton
对象,但是你将它分配给self.myButton
。此时,tempButton
和self.myButton
都是指向同一对象的指针。现在,大概你使用的myButton
@property
是一个强大的属性,所以通过为它分配tempButton
,你增加了它的保留计数,因此在任何一个版本的代码中它都会最后有一个+1的保留计数,并且不会被解除分配。
假设myButton
不是一个强大的属性,那么代码中就会出现错误,并且在这两种情况下tempButton
都会过早释放并解除分配。以下是两种情况下会发生的情况:
在您的第一个版本中,由于您tempButton
来自init
或copy
方法之外的其他内容,因此保留计数为+1,但会自动释放。在运行循环的当前迭代结束时,自动释放将启动,使其保留计数为0并使其被解除分类。
在第二个版本中,您首先获得保留计数为1的tempButton
,因为它来自init
方法。但是稍后您明确释放它,将其保留计数设置为0,此时它立即被释放。
答案 1 :(得分:-1)
非init方法与:
完全相同UIButton *tempButton = [[[UIButton alloc] initWithFrame:CGRectMake(0,0,300,44)] autorelease];
因此,我们的想法是更多地了解自动发布池的工作原理,大部分时间都非常有用,但是你需要了解它是如何工作的,因为你将在应用程序中使用该对象。 并注意一些事情,当你将临时按钮添加到你的视图将保留它的视图时,并且当它从中删除时将释放它,你可以使用乐器并检查对象的保留计数,如果你想查看如何释放/如果你想看到它正在发挥作用,就会继续保留。