Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用Objective-C和Swift创建内存泄漏_Ios_Objective C_Swift_Memory Leaks_Objective C Runtime - Fatal编程技术网

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

Ios 使用Objective-C和Swift创建内存泄漏,ios,objective-c,swift,memory-leaks,objective-c-runtime,Ios,Objective C,Swift,Memory Leaks,Objective C Runtime,我接受了一次采访,被要求使用Objective-C和Swift创建内存泄漏。那么如何使用Objective-C和Swift创建内存泄漏呢?如果CGImageRef对象已创建但未发布,则ARC无法释放这些对象。您只需要创建一个引用周期。 Obj-C: 这同样适用于Swift: class MyClass { var otherObject: MyClass? } let a = MyClass() let b = MyClass() a.otherObject = b b.otherOb

我接受了一次采访,被要求使用Objective-C和Swift创建内存泄漏。那么如何使用Objective-C和Swift创建内存泄漏呢?

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

您只需要创建一个引用周期。 Obj-C:

这同样适用于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();

只需浏览有关如何创建内存泄漏以及如何避免内存泄漏的链接,我认为当viewcontroller解除锁定时,会自动释放内存泄漏。如果您需要一个简单的示例,您可以指定一个.otherObject=a.正确答案。我认为块中的强引用也可能导致内存泄漏?但有时编译器会警告我块中的内存泄漏,有时不会,我当时很困惑。@HensonFang可以,但这只是这个示例的一个更复杂的实例。@HensonFang,是的,在某些情况下。如果您使用的是GCD,那么很可能一切都会好起来,因为GCD不会存储对对象的引用。但是,例如,如果您有一个NSOperationQueue,并且您创建了一个引用self的带有block的操作,那么您的self有一个对queue的引用,队列有一个对operation的引用,operation to block,block to self。回答得好。我投了一个方块的例子,以供参考。
void leakVampires() {
    void *buffy = malloc(42);
 }

  ...
 leakVampires();