Iphone 结构是否可以解除分配?

Iphone 结构是否可以解除分配?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我在头文件中声明了一个结构,如下所示: typedef struct { NSString *department; NSString *departmentId; } Department; Department currentDepartment; 这个结构在一个相当简单的类中。我在viewDidLoad中指定结构值。在离开viewDidLoad之前,我看到结构值仍然存在。在用户单击一个段控件后,我重新分配结构值。在赋值之前,我看到两个结构值是0x0。我确实启用了nszombied,当

我在头文件中声明了一个结构,如下所示:

typedef struct {
NSString *department;
NSString *departmentId;
}  Department;

Department currentDepartment;
这个结构在一个相当简单的类中。我在viewDidLoad中指定结构值。在离开viewDidLoad之前,我看到结构值仍然存在。在用户单击一个段控件后,我重新分配结构值。在赋值之前,我看到两个结构值是0x0。我确实启用了nszombied,当我在应用程序运行时将鼠标悬停在结构上并且我的一个断点被击中时,它会打印出来:

MyApp[25722:207] *** -[CFString _cfTypeID]: message sent to deallocated instance 0xfc0e90

我没有创建结构的实例或取消分配它。它是如何被释放的?

不,结构可以被释放,但除非您自己在代码中的某个地方这样做。从错误消息中可以看出,本例中释放的是一个字符串。设置
部门
部门ID
成员时,请检查正在使用的对象


事实上,在将对象分配给结构成员时,通常需要特别小心内存管理。在这种情况下,您可能需要向字符串发送
-retain
消息,或者更改创建字符串的方式,以便使用
alloc/init…
copy
而不是
stringWith…
或其他方法

我强烈建议尽可能不要将对象放在结构中。结构只是数据的哑集合,不能像对象使用访问器那样管理其成员的内存。这意味着客户机代码必须承担在处理结构成员时保留和释放结构成员的责任,并确保在strict超出范围之前释放它们——这真的不是那么容易。最好创建一个轻量级对象。

说明:结构(在类型意义上)不能被释放,内存块可以被释放。您永远不会将结构类型的变量传递给free,只有指针.C结构可以通过malloc()、calloc()等动态分配。如果以这种方式分配结构,则可以(并且应该)释放它。您似乎将其与定义struct类型的变量相混淆。(当然,任何动态分配的地址都必须存储在指针类型的变量中。)我不同意,在某些用例中,结构比轻量级类更有意义。诀窍是识别那些罕见的情况:)@rpetrich:如果你说的是带有对象的结构,那么这些情况似乎非常罕见,我认为你更可能遇到不安全goto的好情况。在iPhone操作系统的键盘和自动更正功能的内部表示中经常使用对象的结构(一个示例)(我并不是说我的评论是有争议的。99%的情况下,对象的结构是错误的方法)