Используя C Structs, который содержит объекты ObjC? - PullRequest
8 голосов
/ 22 марта 2010

Я использую C-структуры в objc, и я создал функцию, которая собирает структуру, подобную той, что есть в Cocoa API. Дело в том, что эта структура не похожа на NSRect или NSPoint. Эта структура упаковывает объекты objc, так что я вижу здесь потенциальную утечку памяти. Нужно ли предоставлять функцию для «освобождения» структуры?

Я не создаю класс ISKNewsCategory, потому что не будет никакого поведения, но Вы думаете, что это хороший подход, или я должен определить класс, даже если не будет никакого поведения?

typedef struct ISK_NewsCategory {
    NSString *name;
    NSString *code
} ISKNewsCategory;

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *name, NSString *code) {
    ISKNewsCategory category;
    category.name = [name retain];
    category.code = [code retain];
    return category;
}

Ответы [ 4 ]

9 голосов
/ 22 марта 2010

В целом, вам было бы гораздо лучше создать простой контейнерный класс. Таким образом, все управление памятью легко, и вы можете использовать объект в стандартных классах контейнеров Какао, не разбираясь с оберткой структуры в NSValue или чем-то еще.

Единственное время, которое может быть приемлемым для использования структуры таким образом, - это если у вас чрезвычайно критичный к производительности код, из-за которого могут возникнуть проблемы с объектами.

@interface ISKNewsCategory : NSObject
{
    NSString *name;
    NSString *code;
}
@property (copy) NSString *name;
@property (copy) NSString *code;
@end

@implementation ISKNewsCategory
@synthesize name,code;
- (void)dealloc
{
    self.name = nil;
    self.code = nil;
    [super dealloc];
}
@end
2 голосов
/ 22 марта 2010

Я ненавижу создавать классы без поведения тоже. : / Это печальный аспект Objective-C: классы многословны.

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

Если вы планируете вообще обходить свои объекты, я думаю, вы должны сделать его полноценным классом. Если вы этого не сделаете, простая структура будет в порядке.

Что касается необходимости "деструктора", у вас должен быть один. У вас всегда должен быть один, если для вашей структуры требуется очистка.

2 голосов
/ 22 марта 2010

Все, что вы удерживаете, вы должны освободить. Однако ничто не говорит о том, что вы должны их сохранить. Если структура «владеет» объектами, тогда да, вы должны сохранить их, а затем вы должны освободить их. Однако, если объекты хранятся в другом месте, возможно, вы захотите рассмотреть слабые ссылки, где вы не сохраняете объекты.

0 голосов
/ 26 сентября 2011

Я надеюсь, что это решение будет полезным для вас.

typedef struct ISK_NewsCategory {
    NSString *name;
    NSString *code;
} ISKNewsCategory;

NS_INLINE ISKNewsCategory ISKMakeNewsCategory(NSString *inName, NSString *inCode) {

    ISKNewsCategory category;

    [category.name autorelease];
    category.name = [inName retain];

    [category.code autorelease];
    category.code = [inCode retain];

    return category;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...