gpt4 book ai didi

iphone - 使用结构体指针作为@property

转载 作者:行者123 更新时间:2023-12-03 20:21:04 26 4
gpt4 key购买 nike

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

上面的代码会造成任何麻烦吗?这是对的吗?看起来工作正常,但我想我需要一个保证。

最佳答案

这取决于您如何使用该类的实例。例如:

SomeClass *obj = [SomeClass new];
// never assign an address to obj.info
[obj release];

不会有事的。

但是,由于您已将该属性声明为可读写,因此您需要考虑该结构所指向的对象的所有权。

例如,在:

SomeClass *obj = [SomeClass new];
obj.info = someInfo;
[obj release];

您在-init中分配的对象没有被释放(您正在泄漏它),并且someInfo指向的对象被释放。您可以将属性 setter 更改为:

- (void)setInfo:(InfoStruct *)newInfo {
if (newInfo != info) {
free(info); // free previous object
info = newInfo;
}
}

在这种情况下,赋值总是会释放前一个对象,除非分配的值与前一个值相同。这意味着您的类实际上拥有其地址被分配给该属性的对象。

如果您决定该类不应该负责释放除 -init 中创建的对象以外的对象,事情会变得有点复杂。如果为 info 分配的地址不是在 -init 中创建的原始 info 的地址,则客户端代码需要释放 obj .info 在为其分配新值之前。例如:

SomeClass *obj = [SomeClass new];
free(obj.info);
obj.info = someInfo;
[obj release];

这是有问题的,因为您在类之外有代码释放该类的对象使用的内存,这是相当侵入性的。而且,如果该类不负责释放 -init 中创建的对象以外的对象,则需要保留额外的状态来指示这一点,以便 -dealloc 仅释放 info 如果 info 在对象初始化后没有更改。

此外,正如 Jim 所说,正确的方法名称是 dealloc

关于iphone - 使用结构体指针作为@property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7532809/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com