我在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;
}
答案 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