我想使用struct
指针作为@property
,但我不确定如何释放它。
这就是我现在所拥有的:
·H:
@property (nonatomic, assign) InfoStruct * info;
的.m:
@synthesize info;
- (id)init {
self = [super init];
if (self) {
self.info = (struct InfoStruct *) malloc(sizeof(struct InfoStruct));
}
return self;
}
-(void)dealloc {
free(info);
[super dealloc];
}
上面的代码可能会造成麻烦吗?这是对的吗?似乎工作正常,但我想我需要保证。
答案 0 :(得分:5)
这应该可以正常工作。标记为@property
的{{1}}可以处理常规的C数据类型,无论它们是数字基元还是指针。你指向一个结构的事实不会改变它。
请注意你的记忆,因为看起来你的财产是读写的,任何分配给你的财产的人可能都没有意识到你的对象“拥有”它(例如在assign
中呼叫free()
,并且如果为其分配新值,则需要-dealloc
- 属性的旧值)。除非您有理由希望此属性为读写,否则您可能需要将其标记为free()
。
答案 1 :(得分:5)
这取决于您如何使用该类的实例。例如:
SomeClass *obj = [SomeClass new];
// never assign an address to obj.info
[obj release];
没关系。
但是,由于您已声明该属性是可读写的,因此您需要考虑该结构所指向的对象的所有权。
例如,在:
SomeClass *obj = [SomeClass new];
obj.info = someInfo;
[obj release];
您在-init
中分配的对象未被释放(您正在泄漏它),someInfo
指向的对象将被释放。您可以将属性设置器更改为:
- (void)setInfo:(InfoStruct *)newInfo {
if (newInfo != info) {
free(info); // free previous object
info = newInfo;
}
}
在这种情况下,除非分配的值与前一个值相同,否则赋值将始终释放前一个对象。这意味着您的类有效地拥有了其地址被分配给该属性的对象。
如果您认为该类不应该负责释放-init
中创建的对象以外的对象,那么事情会变得更复杂。如果为info
分配了除info
中创建的原始-init
地址以外的地址,则客户端代码需要在为其分配新值之前释放obj.info
。例如:
SomeClass *obj = [SomeClass new];
free(obj.info);
obj.info = someInfo;
[obj release];
这是有问题的,因为你在类之外的代码释放该类对象使用的内存,这是非常具有侵入性的。并且,如果类不负责释放除-init
中创建的对象之外的对象,则需要保留其他状态,以便-dealloc
仅在info
时释放info
初始化对象后没有更改。
另外,正如Jim所说,正确的方法名称是dealloc
。
答案 2 :(得分:0)
该方法应称为dealloc
,而不是destroy
。
答案 3 :(得分:0)
我们对您的InfoStruct
一无所知。如果它只包含基本类型,那么调用free(info)
就足够了。
但是,如果它有指向其他类型的指针,则为使用malloc
分配内存,那么free(info)
将不会释放这些对象,并且您将发生内存泄漏。