0

这是 iPhone SDK 的后续:从 SQLite 加载 UITableView

我打算使用以下代码将 SQL 数据加载到数组中。数组的每个元素都是代表每个数据库条目的类:

@interface 行:NSObject { int PK; NSString *desc;

}

@property int PK;@property (nonatomic, 保留) NSString *desc;

@结尾

加载操作将与此类似:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];
Row *myRow = [[Row alloc] init];


for (int i=0; i<10; i++)
{
    myRow.PK = i;
    myRow.desc = [[NSString alloc] initWithFormat:@"Hello: %d", i];
    [array addObject:myRow];
}
[myRow release];

for (int i=0; i < [array count]; i++)
{
    Row *myNrow = [array objectAtIndex:i] ;
    NSLog (@"%@ %d", [myNrow desc], [myNrow PK]);
    myNrow = nil;
}

当然,第一个 for 循环将是来自 SELECT 语句的循环。另一个循环(或该循环的元素)将在 cellInRowIndex 方法中呈现数据。

我有一个关于内存泄漏的问题。上面的代码有内存泄漏吗?Row 类的 decs 字符串属性声明为 (retain)。不应该在某个地方发布吗?

谢谢

4

1 回答 1

1

您应该释放要放入 myRow.desc 的字符串。你可以改变

myRow.desc = [[NSString alloc] initWithFormat:@"Hello: %d", i];

要么

myRow.desc = [[[NSString alloc] initWithFormat:@"Hello: %d", i] autorelease];

或者

myRow.desc = [NSString stringWithFormat:@"Hello: %d", i];

编辑:如果你想使用一个中间 NSString (正如你在评论中提到的),你可以这样做:

NSString *foo = [[NSString alloc] initWithFormat:@"Hello: %d", i];
myRow.desc = foo;
[foo release];

或者:

NSString *foo = [NSString stringWithFormat:@"Hello: %d", i];
myRow.desc = foo;

请注意,在第二个示例中 foo 已经自动释放,因此您不能释放它。

于 2009-10-12T22:43:53.503 回答