我看到一种奇怪的行为,我需要一些帮助。
在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:,则数组有一个预期的元素,但对象的状态和路由元素是僵尸。
有关为何会发生这种情况的想法吗?
谢谢。
答案 0 :(得分:10)
结构遵循Objective-C中与C完全相同的规则,因为它是一个严格的超集。因此,直接赋值是浅层副本,而仅释放directions directionsLoc;
的概念并不合理。
但是,您已经创建了至少一个存储在方向结构中的东西 - routes
数组 - 作为自动释放的对象。因此,当下一个当前自动释放池耗尽时,它将被释放,如果你自己没有在该区域做任何事情,那么至少在堆栈展开之前不会发生这种情况。
所以问题根本不是结构,它是正常的内存管理规则,可能与将值存储到结构看起来像Objective-C 2.0语法以设置和获取属性这一事实相结合,但不涉及任何一种方法调用,所以不能保留或复制。