2014-07-16 35 views
0

假设我有其是C结构的性质的对象(为说与现有软件的向后兼容)暴露结构属性的地址是否是一种好的做法?

typedef结构{
...
}图像;

@property(assign)image img;

现在假设某些函数func(image * img)需要img的地址。

我有两个替代方案(即我可以看到):

1)写在它返回IMG 的地址类的吸气剂的方法,该地址传递给FUNC()

2 )复制一个结构体,如
image img0 = object.img;
func(& img0);

现在(1)更快,而(2)更“安全”,这意味着func不会搞乱对象数据。 有没有这样做的“标准”方式,或者它基本上取决于我?

回答

0

这基本上取决于你。

请注意,在(2)中,如果func()应该修改结构,那些修改将不会影响object.img,除非您将修改的结构体分配回该属性。

如果func()不是修改结构,你可以声明它采取一个const指针,你可以使一个方法返回一个const指针。这不会让你打开封装违规。尽管如此,它似乎是一种代码味道给我。

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

为了绝对安全,调用者保存指向结构的指针,该方法可以创建临时副本,将指针传递给副本,在块返回后验证结构内容(如果有必要),如果有效,将其分配回其内部存储。

1

简单的方式来声明和访问结构在Objective-C

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: -

+0

该“教程”中的任何内容都不会将结构作为对象的属性进行寻址。 –

相关问题