假设我有一个具有c结构属性的对象(比如说是为了与现有软件向后兼容)
typedef struct {
...
} image;
@property(assign)image img;
现在假设某些函数func(image * img)需要img。
的地址我有两种选择(我可以看到):
1)在类中编写一个getter方法,返回img的地址 并将此地址传递给func()
2)制作结构的副本,如中
image img0 = object.img;
func(& img0);
现在(1)更快,而(2)更安全"这意味着func不会弄乱对象数据。 是否有"标准"这样做的方式,还是基本上取决于我?
答案 0 :(得分:1)
在objective-c
中声明和访问struct的简单方法typedef struct Books
{
NSString *title;
NSString *author;
NSString *subject;
int book_id;
}BookStructure;
//Now create property of BOOK1
@property(assign)BookStructure BookObj;
//Now setting value in structure variavble
int main( )
{
self.BookObj.title = @"Objective-C Programming";
return 0;
}
有关详细信息,请参阅此tutorial: -
答案 1 :(得分:0)
这基本上取决于你。
请注意,在(2)中,如果func()
应该修改结构,那么这些修改不会影响object.img
,除非您将修改后的结构分配回该属性。
如果func()
没有修改结构,你可以声明它采用一个const指针,你可以创建一个返回const指针的方法。这并不会让您对封装违规行为持开放态度。不过,对我来说,这似乎是一种代码味道。
另一种方法是创建一个接受块来操作结构的方法。该块将采用(非常量)指向结构的指针作为参数。该块可以通过该指针修改结构。但是,作为设计合同的一部分,它不能在块完成后保存该指针以供使用。这允许对象以不违反封装的方式临时直接访问结构。该对象始终有一种方法可以了解所做的修改,因为客户端必须在其上调用方法。
为了对调用者保存指向结构的指针的绝对安全性,该方法可以进行临时复制,将指针传递给块,在块返回后验证结构内容(如果有效),如果有效,将其分配回内部存储空间。