我有一些令我困惑的代码
代码是:
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
我可以将其更改为将NSString
从getString
直接发送到insertRoom
代码并绕过实际创建NSString
每次通过循环
我很困惑这个
ARC是否自动处理此问题,允许我在循环中一遍又一遍地声明NSString
或者创建了内存泄漏?
提前致谢
菲尔
答案 0 :(得分:2)
当他们说字符串是不可变的时,它们意味着字符串指针指向的对象是不可变的。但是你的指针可以指向一个新的不可变字符串,而不会影响前一个字符串对象。您可以通过记录循环中对象的地址来确认您正在查看新对象,例如
NSLog(@"roomName=%p", roomName);
毫无疑问,每次迭代都会看到一个新地址,证明你正在处理一个新对象。
在回答你的问题时,不,这不会导致泄密。删除对它的最后一个强引用时,将自动释放字符串对象。例如,如果你的insertRoom
方法将它添加到数组中,那么显然字符串将保留,只要数组是,但是当数组被释放时,你的字符串房间名称也将被释放。最重要的是,这不应该导致泄漏。