我在从NSMutableArray
删除项目时遇到问题。我对Objective-C非常新,所以请耐心等待。
到目前为止,我有以下内容:如果内部有某些文本,我正在尝试从数组中删除一行。我在快速枚举时不能这样做,所以我试图存储索引,以便在枚举完成后删除。但是,我被告知这是一个没有强制转换的整数指针。困惑!
//First remove any previous Offending entry.
//Read hostfile into array.
NSString *hostFileOriginalString = [[NSString alloc] initWithContentsOfFile:@"/etc/hosts"];
NSMutableArray *hostFileOriginalArray = [[hostFileOriginalString componentsSeparatedByString:@"\n"] mutableCopy];
NSInteger hostFileOffendingLocation;
//Use a for each loop to iterate through the array.
for (NSString *lineOfHosts in hostFileOriginalArray) {
if ([lineOfHosts rangeOfString:@"Offending"].location != NSNotFound) {
//Offending entry found, so remove it.
//[hostFileOriginalArray removeObject:lineOfHosts];
hostFileOffendingLocation = [hostFileOriginalArray indexOfObject:lineOfHosts];
//NSLog(@"%@", hostFileOffendingLocation);
}
}
//Release the Array.
[hostFileOriginalArray release];
//Remove offending entry from Array.
[hostFileOriginalArray removeObject:hostFileOffendingLocation];
答案 0 :(得分:0)
我真正的问题是为什么在修改数组之前发布数组
尝试移动
[hostFileOriginalArray release];
到
之后[hostFileOriginalArray removeObject:hostFileOffendingLocation];
答案 1 :(得分:0)
您可以通过调用[hostFileOriginalArray removeObjectIdenticalTo:@"Offending"];
请注意,它会删除违规对象的多个实例,但这看起来就像你想要的那样。它还将以快速方式执行操作,而无需担心要使用哪个循环的实现细节。
作为一般规则(特别是对于容器和NSString等真正常用的对象),请检查类引用以查看Apple是否已经有办法执行您想要执行的操作。它使您的代码对其他Cocoa用户(包括未来的用户)更具可读性,并减少代码维护 - 您现在可以将其留给Apple在其代码中添加Fast Enumeration等新技术,并在链接时免费获取针对新版本的SDK。
此外,您应该在函数末尾返回hostFileOriginalArray,因此它可以执行一些有用的操作 - 您可以将其作为自动释放的对象返回。
答案 2 :(得分:0)
//Remove offending entry from Array.
[hostFileOriginalArray removeObjectAtIndex:hostFileOffendingLocation];
//Release the Array.
[hostFileOriginalArray release];
你本来应该得到编译器警告......看看他们,他们通常非常有帮助,我总是试着有0警告......这样我知道我做了什么粗心的事情。