typedef struct в Obj-c - PullRequest
       12

typedef struct в Obj-c

2 голосов
/ 07 июля 2011

Я вижу странное поведение, и мне нужна помощь с ним.

В структуре. Ч у меня есть:

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

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

В структуре. 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 Ответ

10 голосов
/ 07 июля 2011

Структуры следуют точно таким же правилам в Objective-C, что и C, поскольку это строгий надмножество. Таким образом, прямое назначение - это мелкая копия, и концепция освобождения только directions directionsLoc; на самом деле не имеет смысла.

Однако вы создали по крайней мере одну из вещей, которая хранится в структуре направлений - массив routes - как объект с автоматическим выпуском. Поэтому он будет освобожден, когда в следующий раз будет слит текущий пул автоматического выпуска, что не произойдет, по крайней мере, пока стек не раскрутится, если вы сами ничего не делаете в этой области.

Таким образом, проблема вовсе не в структуре, а в нормальных правилах управления памятью, возможно, в сочетании с тем фактом, что сохранение значений в структуре выглядит как синтаксис Objective-C 2.0 для установки и получения свойств, но не требует каких-либо вызов метода, поэтому сам по себе не может сохранять или копировать.

...