使用arc会导致内存泄漏吗?

时间:2013-05-25 17:32:42

标签: objective-c memory-leaks automatic-ref-counting

我有一些令我困惑的代码

代码是:

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调用以返回可变NSString ,或转换来自通话的回报

令我惊讶的是,上面实际上是有效的,并允许重新创建相同的NSString

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

我很困惑这个

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

或者创建了内存泄漏?

提前致谢

菲尔

1 个答案:

答案 0 :(得分:2)

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

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

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

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