相关疑难解决方法(0)

为什么ARC仍然需要@autoreleasepool?

在大多数情况下使用ARC(自动引用计数),我们不需要考虑使用Objective-C对象的内存管理.不允许再创建NSAutoreleasePools,但是有一个新的语法:

@autoreleasepool {
    …
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,当我不应该手动释放/自动释放时,为什么我需要这个呢?


编辑:总结我从所有的答案和评论中得到的简洁:

新语法:

@autoreleasepool { … } 是新的语法

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
…
[pool drain];
Run Code Online (Sandbox Code Playgroud)

更重要的是:

  • ARC使用autorelease以及release.
  • 它需要一个自动释放池才能这样做.
  • ARC不会为您创建自动释放池.然而:
    • 每个Cocoa应用程序的主线程都有一个自动释放池.
  • 有两种情况你可能想要使用@autoreleasepool:
    1. 当您在辅助线程中并且没有自动释放池时,您必须自己制作以防止泄漏,例如myRunLoop(…) { @autoreleasepool { … } return success; }.
    2. 当你想创建一个更本地的游泳池时,正如@mattjgalloway在他的回答中所示.

memory-management objective-c xcode4.2 automatic-ref-counting

191
推荐指数
4
解决办法
7万
查看次数

Objective-C属性的默认属性是什么?

当您没有在目标C中列出任何内容时,适当的默认属性是什么?

例如,如果我写这个:

@property float value;
Run Code Online (Sandbox Code Playgroud)

默认值是什么,比如它是只读的,是否会保留......等等?

cocoa-touch objective-c

42
推荐指数
2
解决办法
2万
查看次数

如何使用实例方法作为只接受func或文字闭包的函数的回调

在"ViewController.swift"中我创建了这个回调:

func callback(cf:CFNotificationCenter!, 
    ump:UnsafeMutablePointer<Void>, 
    cfs:CFString!, 
    up:UnsafePointer<Void>, 
    cfd:CFDictionary!) -> Void {

}
Run Code Online (Sandbox Code Playgroud)

使用此观察者:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), 
    nil, 
    self.callback, 
    "myMESSage", 
    nil, 
    CFNotificationSuspensionBehavior.DeliverImmediately)
Run Code Online (Sandbox Code Playgroud)

导致此编译器错误:

"AC函数指针只能通过对'func'或文字闭包的引用形成"

callback swift

26
推荐指数
1
解决办法
1万
查看次数

Memory Leak和Zombie有什么区别?

我正在开发一个基于ARC的项目.我从未参与过基于Non ARC的项目.最近我

在我启用ARC的项目中遇到了一个僵尸.据我所知,那里不会有记忆

在ARC中泄漏,因为对象将自动解除分配.但我遇到了一个僵尸

说"消息传递给一个解除分配的实例".我的困惑是内存泄漏等价物

去一个僵尸.如果是这种情况,那么内存泄漏也会发生在ARC中吗?有帮助吗?

xcode memory-leaks objective-c automatic-ref-counting

15
推荐指数
1
解决办法
2598
查看次数

废弃内存与内存泄漏有什么区别?

两者完全相同,只是"废弃的内存"指的是泄漏的整个对象图而不是单个对象.对?

memory-leaks memory-management objective-c ios abandoned-memory

12
推荐指数
2
解决办法
1828
查看次数

无主与弱.为什么我们应该更喜欢无主?

正如Apple在"Swift编程语言"中所说,似乎我们应该unownedweak任何可能的更喜欢:

如果捕获的引用永远不会变为nil,则应始终将其捕获为无主引用,而不是弱引用.

本页的"弱和无主参考"部分

我确实知道这两者之间的区别.但我好奇的是有没有很好的理由,宁愿 unownedweak?我认为weak更安全,我们可以总是编写[weak obj]和可选的绑定检查,而不考虑存在的可能性obj.

它与某些性能考虑或我错过的东西有关吗?或者是否完全可以使用weak而不是一直使用unowned

memory-management swift

11
推荐指数
1
解决办法
1350
查看次数