使用 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
原因:a
对b
持有强引用,b
对a
持有强引用。 ARC 在运行时没有任何垃圾回收。它只是跟踪引用计数。在这种情况下,即使我们在代码中没有对 a
或 b
的任何引用,它们的引用计数也永远不会达到 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();
我有一个面试,我被要求用 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
原因:a
对b
持有强引用,b
对a
持有强引用。 ARC 在运行时没有任何垃圾回收。它只是跟踪引用计数。在这种情况下,即使我们在代码中没有对 a
或 b
的任何引用,它们的引用计数也永远不会达到 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();