我希望澄清这里正在进行的过程。
我创建了一个 UIButton 的子类,它的 init 方法如下所示:
- (id)initWithTitle:(NSString *)title frame:(CGRect)btnFrame {
self = [UIButton buttonWithType:UIButtonTypeCustom];
[self setTitle:title forState:UIControlStateNormal];
self.frame = btnFrame;
return self;
}
在我的 View Controller 中,我正在创建这些按钮之一并将其添加为 subview :
myButton = [[CustomButton alloc] initWithTitle:@"Title" frame:someFrame];
[self.view addSubview:myButton];
在 View Controller 的
dealloc
方法我记录我的按钮的保留计数:- (void)dealloc {
NSLog(@"RC: %d", [myButton retainCount]); //RC = 2
[super dealloc];
NSLog(@"RC: %d", [myButton retainCount]); //RC = 1
}
根据我的理解,myButton 实际上并没有保留,即使我使用
alloc
调用它也是如此。 ,因为在我的子类中我创建了一个自动释放按钮(使用 buttonWithType:
)。在
dealloc
,这是否意味着,当调用dealloc时,superview释放按钮并且它的保留计数下降到1?该按钮尚未自动释放? 或者我是否需要在调用 [super dealloc] 后将保留计数减为零?
干杯。
最佳答案
这值得两个答案....一个针对特定问题,另一个针对在-init(这个)中替换实例时如何管理内存。
在 Objective-C 内存管理领域,初始化器是一只奇怪的鸟。实际上,您正在管理 self
.进入时,self
被保留。退出时,您应该返回一个保留对象——不必是与 self
相同的对象。 -- 或 nil
.
所以,打破 [[[Foo alloc] init] autorelease]
的标准习语向下:
id x = [Foo alloc]; // allocates instance with RC +1
x = [x init]; // RC is preserved, but x may differ
[x autorelease]; // RC -1 (sometime in future)
请注意,所有保留计数 [RC] 表示为 三角洲 .
因此,在
init
方法,您通常 不要更改 self
的保留计数一点也不! 但是,如果要返回其他对象,则需要
release
self
和 retain
无论您要返回什么(无论是当时分配的还是之前分配的其他地方,比如从缓存中检索对象时)。具体来说,因为这个答案过于迂腐,所以一切都被吹成了单独的表达方式:
- init {
[self release];
self = nil;
id newObject = [SomeClass alloc];
newObject = [newObject init];
if (newObject) {
self = newObject;
... initialize self here, if that is your fancy ...
}
return self;
}
关于iphone - dealloc 中的自定义 UIButton 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4568212/