使用 Objective-C 和 Swift 创建内存泄漏

Creat a memory leak with Objective-C and Swift

我有一个面试,我被要求用 Objective-C 和 Swift.So 创建内存泄漏 如何用 Objective-C 和 Swift 创建内存泄漏?

如果CGImageRef反对创建但未释放,则ARC无法释放这些对象。

您只需要创建一个引用循环。 目标 C:

@interface MyClass : NSObject
@property (strong) MyClass *otherObject;
@end

@implementation MyClass
@end

//...

MyClass *a = [MyClass new];
MyClass *b = [MyClass new];
a.otherObject = b;
b.otherObject = a;

同样适用于Swift:

class MyClass {
    var otherObject: MyClass?
}

let a = MyClass()
let b = MyClass()
a.otherObject = b
b.otherObject = a

原因ab持有强引用,ba持有强引用。 ARC 在运行时没有任何垃圾回收。它只是跟踪引用计数。在这种情况下,即使我们在代码中没有对 ab 的任何引用,它们的引用计数也永远不会达到 0,因为它们相互引用(除非我们将手动打破这个循环)。

UPD(@Sulthan 的荣誉):你实际上什至不需要两个对象,一个强大的自引用就足够了:

a.otherObject = a

区块示例:

@interface Foo:NSObject
@property(strong, copy) dispatch_block_t block;
- (void)doTheMagic;
@end

...
Foo *f = [Foo new];
f.block = ^{
   [f doTheMagic];
};

修复:

Foo *f = [Foo new];
__weak typeof(f) __weakF = f;
f.block = ^{
   // you can do the __strong dance here if you use __weakF more than once
   [__weakF doTheMagic];
};

malloc 示例:

void leakVampires() {
    void *buffy = malloc(42);
 }

  ...
 leakVampires();