1

我有一些让我困惑的代码

代码是:

for (int i=0; i < numOfRooms; i++) {

    NSString* roomName = [self getString:themessageReceived :packetstart + index];
    NSLog(@"roomName is %@ with length %d roomID %d",roomName, roomName.length,roomID);
    [roomsInTheClub insertRoom:roomID :roomName];
    index += roomName.length;
    index++;

}

现在最初我在想,看到NSString是不可变的,我需要NSMutableString在循环之上创建一个,然后将getString调用更改为返回一个 mutable NSString,或者从调用中强制返回

我很惊讶上面的内容确实有效,并允许NSString再次创建相同的内容

我可以将其更改为将NSStringfromgetString直接发送到insertRoom代码并绕过实际创建NSString每个通过循环

我对此感到困惑

ARC 是否自动处理此问题,允许我NSString在循环中一遍又一遍地声明相同的内容

还是创建了内存泄漏?

提前致谢

菲尔

4

1 回答 1

2

当他们说一个字符串是不可变的时,他们的意思是你的字符串指针指向的对象是不可变的。但是您的指针可以指向一个新的不可变字符串,而不会影响之前的字符串对象。您可以通过在循环中记录对象的地址来确认您正在查看一个新对象,例如

NSLog(@"roomName=%p", roomName);

毫无疑问,每次迭代都会看到一个新地址,证明您正在处理一个新对象。

在回答您的问题时,不,这不会导致泄漏。当您删除对它的最后一个强引用时,该字符串对象将被自动释放。例如,如果您的insertRoom方法是将其添加到数组中,那么显然只要数组存在,字符串就会保留,但是当数组被释放时,您的字符串房间名称也会保留。最重要的是,这不应该导致泄漏。

于 2013-05-25T18:35:03.053 回答