gpt4 book ai didi

objective-c - Obj-c 中的 typedef 结构

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:57:12 24 4
gpt4 key购买 nike

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

在 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,retention没有保留?如果我在滚动发生时返回方向的 a_Function_that_builds_the_struct 和 NSArray 并且 tableView:cellForRowAtIndexPath: 被执行,数组有一个预期的元素,但对象的状态和路由元素是僵尸。

有没有想过为什么会这样?

谢谢。

最佳答案

结构在 Objective-C 中遵循与 C 完全相同的规则,因为它是一个严格的超集。所以直接赋值是一个浅拷贝,而仅仅释放 directions directionsLoc; 的概念并没有真正意义。

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

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

关于objective-c - Obj-c 中的 typedef 结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6602366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com