iphone - dealloc 中的自定义 UIButton 内存管理

标签 iphone ios memory-management uibutton dealloc

我希望澄清这里正在进行的过程。

我创建了一个 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/

相关文章:

ios - 将 UIStatusBarStyle 更改为 LightContent(白色)在 Swift 中不起作用

c - 声明数组时出现段错误

java - 如何增加Jboss中的Heap和Perm内存?

iphone - 执行pushViewController 是否需要UINavigationController?

iphone - 如何在 iOS 终止应用程序之前在过期处理程序中优雅地结束任务?

ios - 无法更改从 zxingObjc 库为 ios 生成的条形码的颜色?

memory-management - 确定障碍物(栅栏)的使用位置

iphone - 如何查明正在运行的应用来自哪个地区的App Store?

iphone - 文档文件夹中预定义的文件夹层次结构

ios - Twitter 用户图像解析 - Swift