暴露struct属性的地址是一种好习惯吗?

时间:2014-07-16 10:15:02

标签: objective-c

假设我有一个具有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不会弄乱对象数据。 是否有"标准"这样做的方式,还是基本上取决于我?

2 个答案:

答案 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指针的方法。这并不会让您对封装违规行为持开放态度。不过,对我来说,这似乎是一种代码味道。

另一种方法是创建一个接受块来操作结构的方法。该块将采用(非常量)指向结构的指针作为参数。该块可以通过该指针修改结构。但是,作为设计合同的一部分,它不能在块完成后保存该指针以供使用。这允许对象以不违反封装的方式临时直接访问结构。该对象始终有一种方法可以了解所做的修改,因为客户端必须在其上调用方法。

为了对调用者保存指向结构的指针的绝对安全性,该方法可以进行临时复制,将指针传递给块,在块返回后验证结构内容(如果有效),如果有效,将其分配回内部存储空间。