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)
上面的代码可能会造成任何麻烦吗?这是对的吗?似乎工作正常,但我想我需要一个保证.
这应该工作得很好.@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.
| 归档时间: |
|
| 查看次数: |
446 次 |
| 最近记录: |