标签: nsautoreleasepool

为什么Xcode 4.2在main.m中使用@autoreleasepool而不是NSAutoreleasePool?

我注意到在Xcode 4.2中有一种不同的方式来启动main函数:

int main(int argc, char *argv[])
{
    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil,
                                 NSStringFromClass([PlistAppDelegate class]));
    }
}
Run Code Online (Sandbox Code Playgroud)

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}
Run Code Online (Sandbox Code Playgroud)

有人知道这两者之间的区别吗?

xcode autorelease nsautoreleasepool ios

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

NSAutoreleasePool和@autoreleasepool块有什么区别?

我想知道NSAutoreleasePool和@autoreleasepool block之间有什么区别.我已经经历了一些问题,但没有得到任何令人满意的答案.到目前为止我才知道在ARC中我们不能使用NSAutoreleasePool和@autoreleasepool在这两种ARC enabled and disabled情况下都可以使用块.因此,它们在内部是不同的,以这种方式表现.

是否有必要在禁用弧的环境中释放对象,即使我们使用的是NSAutoreleasePool或@autoreleasepool块,或者它们会自动执行?还有,如果ARC自动释放内存,那么为什么我们使用@autoreleasepool block.Please给我一个简短的概述用例子.

memory-management objective-c nsautoreleasepool ios

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

autorelease什么时候实际导致Cocoa Touch发布?

我知道你需要autorelease在iOS 上小心.我有一个方法,它返回一个alloc调用者所需的对象,所以在这种情况下 - 据我所知 - 我需要autorelease在它返回之前发送给被调用者中的对象.

这很好,但是一旦控件返回到手机(即在我的按钮点击处理完毕后),似乎自动释放池已被释放.我怀疑这是应该如何,但我想知道这种情况的最佳做法是什么.

我已经尝试retain从调用者发送一条消息,以便该对象不会被释放,然后显式释放它dealloc.

这是最好的方法吗?

cocoa-touch memory-management autorelease nsautoreleasepool

11
推荐指数
2
解决办法
4490
查看次数

自动释放池以及在iOS下调用发布时

我想澄清一些事情.

可以说我有以下代码:

- (void) viewDidAppear:(BOOL)animated {
  [super viewDidAppear:animated];
  for (int i = 0; i < 5000000; i++) {
    NSString *s = [NSString stringWithFormat:@"Hello, %@!", @"World"];
  }
}
Run Code Online (Sandbox Code Playgroud)

这将在此函数调用中创建500万个自动释放的字符串.我希望这可以保留这些对象直到应用程序终止,因为我看到的唯一的@autoreleasepool是在main.m中包装应用程序实例化的那个.但事实并非如此.在这个函数调用结束时,它们似乎都被调用了它们并从内存中删除.

这个文件:

https://developer.apple.com/library/mac/documentation/cocoa/reference/foundation/Classes/NSAutoreleasePool_Class/Reference/Reference.html

"应用程序工具包在事件循环的每个循环开始时在主线程上创建自动释放池,并在最后将其排出,从而释放处理事件时生成的任何自动释放的对象."

这对我来说很有意义,但这是在UIKit下,而不是Application Kit.我的问题是,UIKit/Cocoa Touch在这种情况下做了同样的事情,还是有另一种解释我的对象被释放?

谢谢!

cocoa-touch objective-c nsautoreleasepool ios

10
推荐指数
2
解决办法
7940
查看次数

如何判断对象是否在NSAutoreleasePool中

我想知道一个对象被自动释放了多少次.我已经使用了足够长的目标c,通常可以直接知道某个对象是否已经自动释放,但是我经常会看到处理内存和保留计数的问题.在某些时候,答案总是结束,"你不能相信一个对象的retainCount" - 我同意这一点,但如果你能确定一个对象被自动释放的次数,那么你真的可以信任 retainCount如果你添加了像这样的类别:

@interface NSObject (NSObject_MemoryDebugging)
- (NSUInteger) autoReleaseCount;
- (NSUInteger) retainCountWithAutoRelease;
@end

@implementation]
/** Determine how many times this object has been marked for autorelease **/
- (NSUInteger) autoReleaseCount;
{
   // ??? not sure how to figure this out.
   return 0;
}

 - (NSUInteger) retainCountWithAutoRelease
{
   NSUInteger retainCount = [self retainCount];
   NSUInteger autoReleaseCount = [self getAutoReleaseCount];  // ???
   return retainCount - autoReleaseCount;
}
@end
Run Code Online (Sandbox Code Playgroud)

对于不可变类型仍然存在异常,因为这些通常会在复制期间增加保留计数,因此您仍然无法信任retainCount.

我不建议的

我不是在生产代码中使用retainCount来寻求此答案.但是,我可以看到这对于调试内存问题的人来说很有价值.

我想有些人会讨厌这个问题,因为程序员不应该关心对象被自动释放的次数.编码应该是关于平衡分配,保留,复制,新版本和故事结束.然而,重点是帮助人们敲打头脑. [NSObject retainCount]烧了很多人,这个问题的答案会很酷.

我确定有一种方法可以确定一个对象被自动释放的次数.我只是不知道它是什么,因此问题.

看到类似的问题:Objective-c中NSAutoreleasePool内的对象.

编辑


谢谢大家的答案.你可能会发现这个有趣的=> …

memory-leaks objective-c nsautoreleasepool ios retaincount

8
推荐指数
2
解决办法
2564
查看次数

NSThread现在会自动创建autoreleasepool吗?

我有这样的测试代码

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];
    [thread start];
}

-(void)test
{
    MyClass *my = [[[MyClass alloc] init] autorelease];
    NSLog(@"%@",[my description]);
}
Run Code Online (Sandbox Code Playgroud)

我没有为自己的线程创建任何自动释放池,但是当线程退出时,对象"我的"只是dealloc.why?

即使我改变我的测试代码如下

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(test) object:nil];
    [thread start];
} 

-(void)test
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    MyClass *my = [[[MyClass alloc] init] autorelease];
    NSLog(@"%@",[my description]);
}
Run Code Online (Sandbox Code Playgroud)

我创建了自己的autoreleasepool但在线程退出时不会将其耗尽.无论如何,对象"我的"仍然可以dealloc.为什么?

我使用Xcode5而不使用ARC

nsthread nsautoreleasepool ios

8
推荐指数
2
解决办法
2624
查看次数

崩溃 - "集合<CALayerArray:0x645dfc0>在被枚举时发生了变异."

目标是"在viewWillAppear开始时启动一个微调器图形,在显示tableview之前加载数据",这样用户就不会想知道为什么在看到表之前会有延迟.即UIActivityIndi​​catorView已被添加到窗口中,我只想设置alpha来隐藏/显示它.

在启动一个线程以确保显示"旋转齿轮"imageview(tag = 333)之前,我得到了这个奇怪的错误,然后继续加载/计算viewWillAppear中的东西.

我不会在每次调用[appdel addGearz]和[appdel removeGearz]时都知道它,这两种情况都会发生,而且它是随机的.它可能发生在2个viewWillAppears之后,或15之后.如果我注释掉设置alpha的行,一切正常.

一个典型的viewWillAppear看起来像这样,

[super viewWillappear];
self.title=@"Products listing"; //and other simple things
[appdel addGearz];
[self getProducts];
[self getThumbnails];
[myTableView reloadData]; //in case view already loaded and coming back from subview and data changed
Run Code Online (Sandbox Code Playgroud)

如果带有.alpha的行未被注释掉,那么代码就会崩溃

-(void)addGearz {
    [NSThread detachNewThreadSelector:@selector(gearzOn) toTarget:self withObject:nil];
}

-(void)removeGearz {
    [NSThread detachNewThreadSelector:@selector(gearzOff) toTarget:self withObject:nil];
}

- (void)gearzOn {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    [window viewWithTag:333].alpha=1.0;
        //
        //  [[window viewWithTag:333] setNeedsDisplay];
    [pool drain];
}

- (void) gearzOff {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] …
Run Code Online (Sandbox Code Playgroud)

iphone enumeration calayer nsthread nsautoreleasepool

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

运行结束循环 - 自动释放池恢复

据我所知,一旦自动释放的池被释放,自动释放的对象就会被清除.现在,自动释放池将在运行循环结束时释放.

我的问题是,如果在我的课程中,我没有创建自定义自动释放池并在该类中的某些对象上调用autorelease方法,那么这些对象将被恢复?"运行循环结束"是否暗示"应用程序结束"?

iphone cocoa-touch objective-c nsautoreleasepool ios

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

自动参考计数(ARC)中的NSThreads

我试图在4.3.5中使用NSThreads和ARC.使用iOS 5,一切都很完美,但如果我在较旧的iOS上尝试它,如4.3它的泄漏.通常我会为NSThreads使用Autoreleasepool,但由于ARC中没有手动Autoreleasepool我不知道如何解决这个问题.

我收到了大量的消息,比如"__NSAutoreleaseNoPool():类NSComparisonPredicate的对象0x4567b40自动释放,没有池到位 - 在我启动一个线程后在我的控制台中泄漏".

NSThread detachNewThreadSelector:@selector(showAlert) toTarget:self withObject:nil];
Run Code Online (Sandbox Code Playgroud)

如何在5.0之前正确地与ARC和iOS进行交互.

干杯网

iphone objective-c nsthread nsautoreleasepool automatic-ref-counting

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

使用@autoreleasepool减少峰值内存使用量

我在一个iPad应用程序上工作,该应用程序具有一个紧密循环使用Web服务和Core Data的同步过程.为了根据Apple的Recomendation减少内存占用,我会NSAutoreleasePool定期分配和排空.这当前效果很好,当前应用程序没有内存问题.但是,我打算转移到NSAutoreleasePool不再有效的ARC,并希望保持同样的性能.我创建了一些示例并计算了它们,我想知道使用ARC的最佳方法是什么,以实现相同的性能并保持代码可读性.

出于测试目的,我想出了3个场景,每个场景使用1到10,000,000之间的数字创建一个字符串.我运行了每个例子3次,以确定他们使用带有Apple LLVM 3.0编译器(w/o gdb -O0)和XCode 4.2的Mac 64位应用程序花了多长时间.我还通过仪器运行每个示例,以大致了解内存峰值.

以下每个示例都包含在以下代码块中:

int main (int argc, const char * argv[])
{
    @autoreleasepool {
        NSDate *now = [NSDate date];

        //Code Example ...

        NSTimeInterval interval = [now timeIntervalSinceNow];
        printf("Duration: %f\n", interval);
    }
}
Run Code Online (Sandbox Code Playgroud)

NSAutoreleasePool批次[原始预ARC](峰值内存:~116 KB)

    static const NSUInteger BATCH_SIZE = 1500;
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    for(uint32_t count = 0; count < MAX_ALLOCATIONS; count++)
    {
        NSString *text = [NSString stringWithFormat:@"%u", count + 1U];
        [text class]; …
Run Code Online (Sandbox Code Playgroud)

memory-management objective-c nsautoreleasepool ios automatic-ref-counting

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