相关疑难解决方法(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万
查看次数

了解NSRunLoop

谁能解释一下是NSRunLoop什么?所以我知道这NSRunLoop是一件与之相关的事情NSThread吗?所以假设我创建一个类似的线程

NSThread* th=[[NSThread alloc] initWithTarget:self selector:@selector(someMethod) object:nil];
[th start];

-(void) someMethod
{
    NSLog(@"operation");
}
Run Code Online (Sandbox Code Playgroud)

在这个线程完成他的工作之后?为什么使用RunLoops或在哪里使用?从Apple docs我已经阅读了一些东西,但对我来说并不清楚,所以请尽可能简单地解释

cocoa-touch objective-c nsrunloop ios

100
推荐指数
3
解决办法
6万
查看次数

[UIImage imageNamed ...]和[UIImage imageWithData ...]之间的区别?

我想从文件系统将一些图像加载到我的应用程序中.有两种简单的方法可以做到这一点:

[UIImage imageNamed:fullFileName]
Run Code Online (Sandbox Code Playgroud)

要么:

NSString *fileLocation = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *imageData = [NSData dataWithContentsOfFile:fileLocation];

[UIImage imageWithData:imageData];
Run Code Online (Sandbox Code Playgroud)

我更喜欢第一个,因为它的代码少得多,但是我看到有些人说图像被缓存了,而且这个方法使用了更多的内存?由于我不相信大多数其他论坛上的人,我想我会在这里问这个问题,是否有任何实际的区别,如果是的话哪个更"好"?

我尝试使用对象分配工具分析我的应用程序,我看不出任何实际差异,虽然我只在模拟器中尝试过,而不是在iPhone本身上.

iphone cocoa-touch

65
推荐指数
5
解决办法
5万
查看次数

我需要释放xib资源吗?

如果我有一个像UILabel链接到xib文件的东西,我是否需要在我的视图dealloc上发布它?我问的原因是因为我没有分配它,这让我觉得我不需要释放它?例如(在标题中):

IBOutlet UILabel *lblExample;
Run Code Online (Sandbox Code Playgroud)

在实施中:

....
[lblExample setText:@"whatever"];
....

-(void)dealloc{
    [lblExample release];//?????????
}
Run Code Online (Sandbox Code Playgroud)

iphone cocoa-touch objective-c

37
推荐指数
1
解决办法
9152
查看次数

发布IOSurface

这个问题是对以下内容的扩展:
Link-1:从ios表面创建图像并保存它
Link-2:从iOS应用程序中截取屏幕截图 - 模拟显示记录器(在内部查询)

(参考链接-1)我有在后台工作时截取屏幕截图的代码.但如上所述,它需要2秒的睡眠才能不间断地工作,否则操作系统会暂停应用程序.我想出原因可能是我没有明确发布我创建的IOSurface.
原因 - 使用Victor Ronin给出的链接http://pastie.org/pastes/3734430,即使没有睡眠,捕获也能正常工作.在我每次写入图像后,我尝试使用CFRelease释放destSurf(我创建的目标表面),但这不起作用.

任何有关何时,如何以及是否发布创建的IOSurface的帮助都将非常有用.谢谢.

更新
所以,这就是确切发生的事情.(参考链接-1)

IOSurfaceRef destSurf = IOSurfaceCreate(dict);
IOSurfaceAcceleratorRef outAcc;
IOSurfaceAcceleratorCreate(NULL, 0, &outAcc);

CFDictionaryRef ed = (__bridge CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys: nil];
IOSurfaceAcceleratorTransferSurface(outAcc, screenSurface, destSurf, ed, NULL);

IOSurfaceUnlock(screenSurface, kIOSurfaceLockReadOnly, &aseed);

CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, IOSurfaceGetBaseAddress(destSurf), (width*height*4), NULL);
CGImageRef cgImage=CGImageCreate(width, height, 8, 8*4, IOSurfaceGetBytesPerRow(destSurf), CGColorSpaceCreateDeviceRGB(), kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little, provider, NULL, YES, kCGRenderingIntentDefault);
UIImage *image = [UIImage imageWithCGImage: cgImage];
CGImageRelease(cgImage);
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
CFRelease(destSurf);
Run Code Online (Sandbox Code Playgroud)
  1. 对CFRelease的调用发生并且app崩溃.没有保存图像.但是,如果您在发布前1-2秒进入睡眠状态,则可以正常工作.
  2. 如果你跳过对UIImageWriteToSavePhotosAlbum()的调用,一切正常,捕获不会中断.
    我仍然不清楚究竟是什么问题以及如何解决它.任何帮助都非常感谢.

iphone-privateapi ios4 ios ios5 ios6

7
推荐指数
1
解决办法
2660
查看次数

解决iPhone上内存泄漏的最佳方法是什么?

请建议解决iphone上内存泄漏问题的最佳方法.释放,自动释放,保留的最佳用途是什么,哪些适用于哪些情况?

iphone memory-leaks ios ios-simulator

4
推荐指数
1
解决办法
1927
查看次数

保留消息是什么意思?

在objective-c中你看到了

[object retain] ;

retain对象发送消息意味着什么,为什么要使用它?

objective-c

3
推荐指数
2
解决办法
3622
查看次数

究竟保留意味着什么?

我想知道以下是什么意思.我要发布它吗?我没有为它分配内存.方法也是类方法.有帮助吗?

object = [[class method] retain];
Run Code Online (Sandbox Code Playgroud)

iphone

2
推荐指数
1
解决办法
642
查看次数

使用iPhone上的obj-c,自动释放所有内容而不是释放是否有任何伤害?

使用iPhone上的obj-c,自动释放所有内容而不是释放是否有任何伤害?

例如,这段代码:

NSString *recipe = [[NSString alloc] initWithUTF8String:sqlite3_column_text(dbps,0)];
[arr addObject:recipe];
[recipe release];
Run Code Online (Sandbox Code Playgroud)

当我创建它时,可以通过自动释放配方nsstring缩短为两行:

NSString *recipe = [[[NSString alloc] initWithUTF8String:sqlite3_column_text(dbps,0)] autorelease];
[arr addObject:recipe];
Run Code Online (Sandbox Code Playgroud)

这有什么缺点吗?我发现它更适合我的编码风格.谢谢大家.

iphone objective-c

2
推荐指数
1
解决办法
155
查看次数

为什么要制作临时对象,将它们设置为变量,然后释放它们?

我经常看到类似的东西:

NSArray *tmpArr = [[NSArray alloc] initWithObjects:@"Info", nil];
self.userInfo = tmpArr;
[tmpArr release];
Run Code Online (Sandbox Code Playgroud)

代替:

self.userInfo = [[NSArray alloc] initWithObjects:@"Info", nil];
Run Code Online (Sandbox Code Playgroud)

有谁知道为什么顶级代码样本更受欢迎?内存管理比第二个更准确吗?

objective-c ios

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

设置条件以避免双重释放已分配的内存

Ubuntu 10.10 gcc 4.4.4

我只是在尝试分配和释放.

但是,当一个对象被多次释放时,我试图避免这个问题.

但是,当我测试时,我注意到创建和释放的obj没有返回到null状态.那么有什么条件我可以设置,如果这确实发生将避免?

我也试过在free之后将对象设置为NULL.但是,它仍然试图释放该对象.

这是对这个问题的引用,只是让你知道不重复: 释放已分配的内存

我的代码如下:

#include <stdio.h>
#include "objects.h"

int main(void)
{
    obj_t *obj = NULL;

    obj = create_object();

    destroy_object(obj);

    destroy_object(obj);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

==

#ifndef OBJECTS_H_INCLUDED
#define OBJECTS_H_INCLUDED

typedef struct Obj_t obj_t;

obj_t* create_object();
void destroy_object(obj_t *obj);

#endif /* OBJECTS_H_INCLUDED */
Run Code Online (Sandbox Code Playgroud)

==

#include <stdio.h>
#include <stdlib.h>

#include "objects.h"

struct Obj_t {
    int obj_id;
};

obj_t* create_object()
{
    obj_t *obj = malloc(sizeof obj);

    return obj;
}

void destroy_object(obj_t *obj)
{
    if(obj != NULL) { …
Run Code Online (Sandbox Code Playgroud)

c malloc free

0
推荐指数
1
解决办法
5480
查看次数

在没有ARC的情况下,我需要在iOS中释放内存?

我有一个方法,不要使用ARC:

-(void)readAppPlist
{
    NSString *plistPath = [self getDataFileDestinationPath];
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSMutableDictionary *temp = (NSMutableDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    if (!temp) {
        NSLog(@"Error reading plist: %@, formatL %d", errorDesc, format);
    }
    items = [[temp objectForKey:@"Items"] mutableCopy];
}
Run Code Online (Sandbox Code Playgroud)

根据内存管理规则,我需要为变量plistPath,plistXML,errorDesc,temp释放内存?我应该另外一个方法,在这里发布它们或者只是将它们放入这个类的dealloc全局方法中吗?

memory-management objective-c ios

0
推荐指数
1
解决办法
247
查看次数