Obj-c中的typedef结构

时间:2011-07-06 20:13:50

标签: objective-c ios struct typedef

我看到一种奇怪的行为,我需要一些帮助。

在structure.h中我有:

typedef struct {
    NSString *summary;
    NSArray *legs;
    NSString *copyrights;
    struct polylineSruct overview_polyline;
    struct directionBounds bounds;    
} route;

typedef struct {
    NSArray *routes;
    NSString *status;
} directions;

在structure.m中我有:

(directions) a_Function_that_builds_the_struct
{
    directions direct;

    direct.status = @"OK";

    NSMutableArray *routes = [NSMutableArray array];
    for(xxx)
    {
        route routeL;
        routeL.summary = @"1";
        routeL.copyrights = @"2";

        NSValue *boxedroute = [NSValue valueWithBytes:&routeL objCType:@encode(route)];
        [routes addObject:boxedroute];
    }

    direct.routes = routes;

    return direct;
}
list_itemsViewController.h中的

我有:

implementation XXX:YYY{
    directions directionsLoc;
}
@property (assign) directions directionsLoc;
list_itemsViewController.h中的

我有:

@synthesize directionsLoc;
....
- (void)viewDidLoad
{
    ....
    self.directionsLoc = a_Function_that_builds_the_struct;
    ....
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [directionsLoc.routes count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    ....
    cell.textLabel.text = directionsLoc.status
    return cell;
}

当我启动应用程序时,我得到包含所有正确行的列表,如果我为tableView滚动了一点:cellForRowAtIndexPath:属性directionsLoc被释放。

有人知道我为什么会遇到这个问题吗?是因为我使用typedef而且保留不被保留?如果我在滚动发生时返回a_Function_that_builds_the_struct和NSArray指示并且执行了tableView:cellForRowAtIndexPath:,则数组有一个预期的元素,但对象的状态和路由元素是僵尸。

有关为何会发生这种情况的想法吗?

谢谢。

1 个答案:

答案 0 :(得分:10)

结构遵循Objective-C中与C完全相同的规则,因为它是一个严格的超集。因此,直接赋值是浅层副本,而仅释放directions directionsLoc;的概念并不合理。

但是,您已经创建了至少一个存储在方向结构中的东西 - routes数组 - 作为自动释放的对象。因此,当下一个当前自动释放池耗尽时,它将被释放,如果你自己没有在该区域做任何事情,那么至少在堆栈展开之前不会发生这种情况。

所以问题根本不是结构,它是正常的内存管理规则,可能与将值存储到结构看起来像Objective-C 2.0语法以设置和获取属性这一事实相结合,但不涉及任何一种方法调用,所以不能保留或复制。