Objective-c内存管理

use*_*234 2 memory-management objective-c

作为Objective-c及其内存管理技术的新成员,比较下面的两个部分.(原始代码是从apple.com 自动释放池中提取的)
问题:
1.这两个部分是否达到了相同的结果?
2.这两个部分是否实现了相同的内存管理结果?(至于内存清理,泄漏等)
3.下面的第二个代码是否违反了最佳做法?性能?

void main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *args = [[NSProcessInfo processInfo] arguments];
    for (NSString *fileName in args) {
        NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
        NSError *error = nil;
        NSString *fileContents = [[[NSString alloc] initWithContentsOfFile:fileName
                                           encoding:NSUTF8StringEncoding error:&error] autorelease];
        /* Process the string, creating and autoreleasing more objects. */
        [loopPool drain];
    }
    /* Do whatever cleanup is needed. */
    [pool drain];
    exit (EXIT_SUCCESS);
}

void main()
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSArray *args = [[NSProcessInfo processInfo] arguments];
    NSString *fileContents = [[NSString alloc] autorelease]; 
    for (NSString *fileName in args) 
    {
        // NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
        NSError *error = nil;
        fileContents = [fileContents initWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:&error];
        /* Process the string, creating and autoreleasing more objects. */
        //[loopPool drain];
    }
    /* Do whatever cleanup is needed. */
    [pool drain];
    exit (EXIT_SUCCESS);
}
Run Code Online (Sandbox Code Playgroud)

jus*_*tin 5

  1. 这两件作品是否达到了相同的效果?

不会fileContents = [fileContents ....第二次调用时,它必然会爆炸和/或泄漏.实现假设其实例的内存为零,因为运行时可以保证这一点.

即使一个初始化程序被证明可以在没有问题或泄漏的情况下工作,但许多初始化程序都不会.

不要试图像这样'更新'你的对象 - 只是请以正常的方式做到=)

序列(在非gc环境中)应该是:1)alloc2)init...(使用指定的初始化程序)3)dealloc.

这两个部分是否实现了相同的内存管理结果?(到目前为止记忆清理,泄漏等)

不可以.除了#1中概述的内容之外,您不应该假设返回的地址alloc与初始化程序返回的地址相同.初始化程序可以选择销毁结果alloc并创建或返回另一个分配.在这种情况下,您将引入引用计数不平衡(效果:泄漏和/或僵尸).

下面的第二个代码是否违反了最佳做法?

NSString *fileContents = [[NSString alloc] autorelease];是奇怪的,非常传统的.我第一次阅读它时,我错过了错误,因为它init...]被放置在alloc和之间是如此常规autorelease.

下面的第二个代码是否违反了性能?

从内循环中删除自动释放池可能会影响性能.当发生大量分配和/或高迭代时,最好创建小型本地化池,如原始池.