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)
- 这两件作品是否达到了相同的效果?
不会fileContents = [fileContents ....第二次调用时,它必然会爆炸和/或泄漏.实现假设其实例的内存为零,因为运行时可以保证这一点.
即使一个初始化程序被证明可以在没有问题或泄漏的情况下工作,但许多初始化程序都不会.
不要试图像这样'更新'你的对象 - 只是请以正常的方式做到=)
序列(在非gc环境中)应该是:1)alloc2)init...(使用指定的初始化程序)3)dealloc.
这两个部分是否实现了相同的内存管理结果?(到目前为止记忆清理,泄漏等)
不可以.除了#1中概述的内容之外,您不应该假设返回的地址alloc与初始化程序返回的地址相同.初始化程序可以选择销毁结果alloc并创建或返回另一个分配.在这种情况下,您将引入引用计数不平衡(效果:泄漏和/或僵尸).
下面的第二个代码是否违反了最佳做法?
NSString *fileContents = [[NSString alloc] autorelease];是奇怪的,非常传统的.我第一次阅读它时,我错过了错误,因为它init...]被放置在alloc和之间是如此常规autorelease.
下面的第二个代码是否违反了性能?
从内循环中删除自动释放池可能会影响性能.当发生大量分配和/或高迭代时,最好创建小型本地化池,如原始池.