使用包含ObjC对象的C结构?

时间:2010-03-21 21:53:19

标签: objective-c

我在objc中使用C结构,并且我创建了一个函数来组装结构,就像Cocoa API中的结构一样。事情是这个结构不像NSRect那么NSPoint这个结构打包objc对象soo我在这里看到了潜在的内存泄漏。我是否需要提供“释放”结构的功能?

我没有创建一个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;
}

5 个答案:

答案 0 :(得分:9)

一般来说,创建一个简单的容器类会好得多。这样所有的内存管理都很简单,你可以在标准的Cocoa容器类中使用该对象,而无需在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

答案 1 :(得分:2)

您保留的任何内容都必须发布。但是,没有什么可以说你必须保留它们。如果结构是“拥有”对象,那么是的,你应该保留它们,然后你必须释放它们。但是,如果对象保留在其他位置,您可能需要考虑不保留对象的弱引用。

答案 2 :(得分:2)

我讨厌创建没有行为的类。 :/这是Objective-C的一个令人遗憾的方面:类很冗长。

你必须记住,每次传递C中的结构时都会被复制。因此,如果您的结构保留其对象并将其提供给其他人,则自动最终会对其中的对象进行错误的引用计数。

如果你计划完全绕过你的物体,我认为你应该把它变成一个完整的课程。如果不这样做,一个简单的结构就可以了。

至于需要“析构函数”,你应该有一个。如果要为你的结构进行清理,你应该总是有一个。

答案 3 :(得分:0)

我希望这个解决方案对您有所帮助。

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;
}

答案 4 :(得分:0)

从2018年开始,您现在可以在C结构中使用ObjC指针,并且在结构内存中保留它们。 https://devstreaming-cdn.apple.com/videos/wwdc/2018/409t8zw7rumablsh/409/409_whats_new_in_llvm.pdf