ios - dealloc 是否会调用属性的 setter 来消除它们?

标签 ios memory-management setter

当 iOS 内存管理释放给定对象时,释放过程是否通过 setter 方法将它可能具有的任何属性的实例变量归零?

最佳答案

不,我们可以使用以下程序进行实验验证:

#import <Foundation/Foundation.h>


@interface CVObject :  NSObject

@property (nonatomic) NSNumber *number;

@end


@implementation CVObject

- (void)setNumber:(NSNumber *)number
{
    NSLog(@"setting number to %@", number);
    _number = number;
}

- (void)dealloc
{
    NSLog(@"deallocating");
}

@end


void doSomething()
{
    CVObject *object = [[CVObject alloc] init];
    object.number = @3;
}


int main(int argc, const char * argv[])
{
    @autoreleasepool {
        doSomething();
    }
    return 0;
}

运行时的输出是:
setting number to 3 
deallocating

通过添加 CVObject* 类型的另一个属性到类,并在 dealloc 中放置一个断点,我们可以在第二个对象的释放处观察堆栈跟踪:
* thread #1: tid = 0x2203, 0x0000000100001a77 DoesDeallocUseProperties`-[CVObject dealloc](self=0x0000000102501da0, _cmd=0x00007fff934f508b) + 23 at main.m:36, stop reason = breakpoint 1.1
    frame #0: 0x0000000100001a77 DoesDeallocUseProperties`-[CVObject dealloc](self=0x0000000102501da0, _cmd=0x00007fff934f508b) + 23 at main.m:36
    frame #1: 0x0000000100001b4a DoesDeallocUseProperties`-[CVObject .cxx_destruct](self=0x0000000100103510, _cmd=0x000f6a00000f6a00) + 90 at main.m:20
    frame #2: 0x00007fff90030fcc libobjc.A.dylib`object_cxxDestructFromClass(objc_object*, objc_class*) + 100
    frame #3: 0x00007fff9002a922 libobjc.A.dylib`objc_destructInstance + 91
    frame #4: 0x00007fff9002afa0 libobjc.A.dylib`object_dispose + 22
    frame #5: 0x0000000100001aa4 DoesDeallocUseProperties`-[CVObject dealloc](self=0x0000000100103510, _cmd=0x00007fff934f508b) + 68 at main.m:37
    frame #6: 0x0000000100001c5c DoesDeallocUseProperties`doSomething + 268 at main.m:48
    frame #7: 0x0000000100001c94 DoesDeallocUseProperties`main(argc=1, argv=0x00007fff5fbffa80) + 36 at main.m:54
    frame #8: 0x00007fff951997e1 libdyld.dylib`start + 1

从跟踪中可以清楚地看出,没有使用任何属性 setter 或 getter 。

现在,为什么会这样?了解属性和实例变量没有内在联系很重要。名称可以独立变化。拥有一个名为 name 的属性是完全合法的。 ,例如,和一个实例变量 _name , 并为 name 实现 setter 和访问器没有实际触及实例变量 _name .如果 ARC 依赖于属性,那么这种情况将是灾难性的。

关于ios - dealloc 是否会调用属性的 setter 来消除它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18799569/

相关文章:

c++ - 修改指针后C++中数组的释放器

c++ - 带有 C++ 对象作为属性的 Objective C ViewController 具有 getter 和 setter,每次引用它时都会重新初始化它

oop - 什么时候不使用 setter 直接在对象上设置属性值被认为是好的设计?

ios - 如何使用 iOS7 Text Kit 将文本环绕在附件周围?

iphone - NSSortDescriptor 根本无法计算数字

ios - NSString和NSMutableString的内存分配

ruby-on-rails - rails : Attr accessor undefined method in the setter

ios - 需要用按钮 Swift 生成的 Int 更改 UIImageView

ios - 使用延迟参数在 objective-c 中创建方法

ios - NSCache 持有指向用 imageWithData : and does not remove from memory on unload 实例化的 UIImage 的强指针