Creat a memory leak with Objective-C and Swift

孤街醉人 提交于 2019-12-10 00:10:38

问题


I had an interview, and I was asked to create a memory leak with Objective-C and Swift.So how to create a memory leak with Objective-C and Swift?


回答1:


You just need to create a reference cycle. Obj-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;

The same applies to Swift:

class MyClass {
    var otherObject: MyClass?
}

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

Reason: a holds a strong reference to b, and b holds a strong reference to a. ARC doesn't have any garbage collection in runtime. It just tracks the reference count. In this situation, even if we don't have any references to a or b in code, their reference count will never reach 0, since they reference each other (unless we'll break this cycle manually).

UPD (kudos to @Sulthan): you don't actually even need two objects, a strong self reference is enough:

a.otherObject = a



回答2:


The block example:

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

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

The fix:

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];
};

The malloc example:

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

  ...
 leakVampires();



回答3:


If CGImageRef objected created and not released, then ARC can't release these objects.



来源:https://stackoverflow.com/questions/42994146/creat-a-memory-leak-with-objective-c-and-swift

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!