使用结构指针作为@property

Val*_*adu 2 iphone macos objective-c ipad

我想使用struct指针作为一个,@property但我不知道我应该如何释放它.

这就是我现在拥有的:

.H:

@property (nonatomic, assign) InfoStruct * info;
Run Code Online (Sandbox Code Playgroud)

.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];
}
Run Code Online (Sandbox Code Playgroud)

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

Lil*_*ard 5

这应该工作得很好.@property标记的assign可以处理常规的C数据类型,无论它们是数字基元还是指针.你指向一个结构的事实不会改变它.

只要小心你的记忆,因为看起来你的财产是读写的,任何分配给你的财产的人可能都没有意识到你的对象"拥有"它(例如,如果你的话,请求free()进入-dealloc,并要求 - free()属性的旧值为其分配一个新值).除非您有理由希望此属性为读写,否则您可能需要对其进行标记readonly.


小智 5

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

SomeClass *obj = [SomeClass new];
// never assign an address to obj.info
[obj release];
Run Code Online (Sandbox Code Playgroud)

会没事的.

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

例如,在:

SomeClass *obj = [SomeClass new];
obj.info = someInfo;
[obj release];
Run Code Online (Sandbox Code Playgroud)

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

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

在这种情况下,除非分配的值与先前的值相同,否则赋值将始终释放前一个对象.这意味着您的类有效地拥有其地址被分配给该属性的对象.

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

SomeClass *obj = [SomeClass new];
free(obj.info);
obj.info = someInfo;
[obj release];
Run Code Online (Sandbox Code Playgroud)

这是有问题的,因为你在类之外的代码释放该类对象使用的内存,这非常具有侵入性.而且,如果类是不负责释放比创造了一个其他对象-init,你需要保持额外的状态表明,这样-dealloc只有释放info,如果info该对象被初始化后没有改变.

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