重用局部变量和对内存的影响

时间:2011-05-26 08:59:54

标签: iphone objective-c cocoa-touch

当我有一个我需要的方法时,往往不方便 为了不同的目的重用相同的局部变量,我倾向于这样做:

NSMutableArray *mutArray = [NSMutableArray arrayWithObjects: @"one", @"two", nil];
[self fooWithArray:mutArray];

mutArray = [NSMutableArray arrayWithObjects: @"three", @"four", nil];
[self barWithArray:mutArray];

//and

MyClass *myClass = [[MyClass alloc]initWithString:@"one"];
self.oneClass = myClass;
[myClass release];

myClass = [[MyClass alloc]initWithString:@"two"];
self.twoClass = myClass;
[myClass release];

记忆方面,这是正确的做法吗? 这段代码容易出现内存泄漏吗?

3 个答案:

答案 0 :(得分:1)

在使用变量之前,不必将对象分配给变量。我可以看到这样做的唯一原因是冗长,但这不是必需的。

你可以逃脱:

[self fooWithArray:[NSMutableArray arrayWithObjects: @"one", @"two", nil]];
[self barWithArray:[NSMutableArray arrayWithObjects: @"three", @"four", nil]];

//and

self.oneClass = [[[MyClass alloc]initWithString:@"one"] autorelease];
self.twoClass = [[[MyClass alloc]initWithString:@"two"] autorelease];

答案 1 :(得分:0)

NSMutableArray *mutArray = [NSMutableArray arrayWithObjects: @"one", @"two", nil];
[self fooWithArray:mutArray];

第一个语句返回一个自动释放的对象,因此不释放它们不会导致任何内存泄漏。试图释放实际上会使应用程序崩溃。

MyClass *myClass = [[MyCalss alloc]initWithString:@"one"];
self.oneClass = myClass;
[myClass release]

假设你有一个使用retain属性声明的oneClass,第二行将引用计数增加到2.现在,当您在第三行中释放myClass时,必须注意在方法dealloc中释放oneClass作为[myClass release]之后引用计数仍为1。

您还可以参考this answer,其中他整齐地描述了内存管理。

答案 2 :(得分:0)

很好的问题。
就内存而言,不会有任何问题,因为你释放分配的内存。但我担心,这不是一个好习惯 你在做什么是这样的:

MyClass *myClass;   // in .h  

因为您使用了同一个对象两次。