使用结构指针作为@property

时间:2011-09-23 17:35:47

标签: iphone objective-c macos ipad

我想使用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];
}

上面的代码可能会造成麻烦吗?这是对的吗?似乎工作正常,但我想我需要保证。

4 个答案:

答案 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)将不会释放这些对象,并且您将发生内存泄漏。