- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 ARC,我知道自动释放池会向其中的所有元素发送释放。考虑以下示例。
-(NSString*)someMethod{
NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
NSString *string2=[[NSString alloc] init]; // string2 retain count is 1
string2=@"sample text inside string 2"; // just assigning
return string1;
}
-(void)viewDidLoad{
NSString *returnedString=[self someMethod];
}
<强>1。所以我的问题是我如何完全释放 string2 一些方法?
<强>2。如何从viewDidLoad方法中完全释放string1?
注意:我使用的是ARC
如果我在 someMethod 中使用@autoreleasepool,那么我认为它会破坏 string1 和 string2。不会吧?
以及在someMethod中使用@autoreleasepool会产生什么效果
-(NSString*)someMethod{
@autoreleasepool{
NSString *string1=@"sample text inside string 1"; // string1 add to main autorelease pool
NSString *string2=[[NSString alloc] init]; // string2 retain count is 1
string2=@"sample text inside string 2"; // just assigning
}
return string1;
}
最佳答案
首先,
NSString *string2=[[NSString alloc] init];
string2=@"sample text inside string 2";
string2 本身不是对象。它是指向对象的指针。所以在这里你创建了一个对象,得到一个指向它的指针,然后立即用一个指向另一个字符串的指针替换它。如果你不使用 ARC,你会在这里泄漏内存。查看@Anoop Vaidya 的回答以了解更多详细信息。
至于你的问题:当你使用ARC时,编译器会自动跟踪对象并在不再使用时释放它们。所以你不必手动释放它。您可以分配一个指向 nil 的指针,但我一想起来就没有必要了。
第二个示例中的代码无法编译,因为 string1 是在自动释放范围内声明的。实际上,这里的 @autorelease 没有任何区别,因为您没有在其中创建自动释放的对象。
This question包含有关使用 ARC 自动释放池的更多详细信息。Apple 的官方文档可能是我见过的最好的,所以请随时查看 their Advanced memory management programming guide .它不是太长,并且详细解释了所有内容:)
关于iphone - @autoreleasepool 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16315621/
在循环操作中将大量autoreleased 对象放入autoreleasepool 是一个很好的做法。我发现有人将@autoreleasepool 放入循环中,但其他人将循环放入@autoreleas
在 ios 中,一个主要的自动释放池围绕着 UIApplicationMain。如果我没有在应用程序内手动设置其他自动释放池,这是否意味着每当我在应用程序中使用自动释放释放对象时,它实际上不会被释放,
我目前正在构建一个通过 API 请求提取大型 JSON 文件的应用。 在下载-解码-存储数据的过程中,我收到了内存警告(超过 500MB)。我找到了一个解决方案来避免内存过载,并通过添加 @autor
我正在使用 ARC,我知道自动释放池会向其中的所有元素发送释放。考虑以下示例。 -(NSString*)someMethod{ NSString *string1=@"sample text
我在大型应用程序中遇到内存问题。我已将其简化为以下代码。如果我让应用程序运行到完成,内存就会耗尽,因此我没有真正的内存泄漏。 但是,在它运行时,每次调用 customLog: 都会累积内存并且内存不会
我在我的代码中混合了一些 ObjectiveC 和 C++。 (我的文件是 .mm 文件,而不是 .m。)什么时候才是用 @autoreleasepool 包装任何代码块的正确理由?不知道我在做什么,
我不能在 main() 中有一个“大的”NSAutoreleasePool——我不允许碰它。那么每个对象有一个池呢? struct MacGuiEngine { // members … Sc
这个问题在这里已经有了答案: How does the NSAutoreleasePool autorelease pool work? (7 个答案) 关闭 6 年前。 我看了很多关于@autor
我有一个头文件(类似 C) 我必须创建一个 Obj-c 库(或者只是几个 .m -s)来实现它。 调用该库的人将是一个 C 程序。 但是我不想手动处理内存分配,我想使用 ARC。 我可以在我的函数中使
我的问题中的术语可能错误,但这是我最好的尝试: 我的 iOS 应用程序的 ARC 启用了 autoreleasepool。因此,我不会根据自己的选择释放内存,但它似乎是在 GC 拾取器上。 我无法让
我尝试在 dispatch_async block 中使用 autoreleasepool,但它不会释放 str。当重复调用 timerEvent 时,会导致内存不足问题。 - (void)viewD
Advanced Memory Management Programming Guide关于@autoreleasepool 说: 使用本地自动释放池 block 减少峰值内存占用量 Many pro
看了GCD的文章,有个例子: dispatch_queue_t bgQueue = myQueue; dispatch_async(dispatch_get_main_queue(), ^{
在ARC下,我们不能再调用autorelease了。本质上,自动释放池的整个概念已经过时了。那么,为什么我们需要 @autoreleasepool 指令? 最佳答案 事实上,在使用 ARC 时,保留/
我正在阅读 llvm 站点上的 ARC 文档:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool ..
我有一个正在重构的应用程序,我刚刚实现了多线程,以便 UI 可以运行得更流畅。在 iPhone 模拟器中,我没有遇到任何泄漏,但在运行 iOS 4.2 的 iPhone 3G 上进行测试时,出现了内存
考虑这个例子: - (void)doSomething { @autoreleasepool { if (someCondition) { /* ... alloc
我正在开发一个 NSData 扩展,它使用 key 加密数据,如下所示。我对 Objective-C 不太了解,但想将它用于这个 Cordova 插件,而不是需要另一个插件来桥接 Swift 文件。
如果我将 UIApplicationMain 包装在 @autoreleasepool 中,是否意味着我永远不必考虑 Objective C 中的内存管理? 例如: @autoreleasepool
所以应用程序崩溃了,没有堆栈跟踪或任何异常,我每次都可以复制这个崩溃。我的第一个想法是它必须是双版本,在运行 zombies 10 分钟后,我无法让应用程序崩溃,一次都没有。 在查看 Allocati
我是一名优秀的程序员,十分优秀!