Objective C中a.b和a-> b之间有什么区别?

时间:2011-01-21 16:46:33

标签: objective-c

A.B的要求是A必须在使用setter或getter之前声明@synthesize 但是A-> B不需要这个。

我不明白哪个更好,哪个使用最少的内存?

如果我从A.B转换为A-> B,它会使用更少的内存还是相同的数量? A-> B使用较少的内存,因为你不需要声明@synthesize,对吧?

5 个答案:

答案 0 :(得分:3)

如果a是Objective-C对象,那么a.b = c;与写[a setB:c];相同。

在这种情况下,

setB:是指定@property (...) typeB b;@synthesize b时自动生成的setter方法的默认名称。您可以放置​​相应的内存说明符,而不是...,而不是保留,赋值,复制。 通过编写a->b = c,您可以避免使用setter方法,并直接访问b

因此,构造a->b产生更少的额外代码,但打破了“封装”的主要OOP概念之一,您还应该手动处理与内存相关的人员。

例如,如果您在retain的{​​{1}}中指定了b,那么构造@property的行为几乎与a.b = c的行为相同。

答案 1 :(得分:2)

由于您的问题也被标记为C,a-> b和ab访问结构(a)的相同元素(b),但在第一种情况下a是指向结构的指针,而在第二种情况下a是一个结构本身。

答案 2 :(得分:2)

这不是一个比另一个好的情况。他们做了不同的事情。

如果声明属性(即@property@synthesize@dynamic),则编译器将为您生成getter和setter,两者都使用标准Objective-C命名惯例。

a-> b实际上是C构建体。它可以在Objective-C中使用,但不太常见。也许最简单的解释方法是使用以下代码:

typedef struct { int a; int b; } someType;

someType a;
someType* b;

// assign values 
a.a = 1;
a.b = 2;

// also assign values (assume memory has been allocated)
b->a = 1;
b->b = 2;

(这是来自记忆。可能有拼写错误。)

答案 3 :(得分:0)

a.b => member b of object a
a->b => member b of object pointed by a

在第一个内存中,对象a在堆栈上分配。在第二种情况下,a指向的对象的内存是从免费存储中提供的。

注意:由于您的问题标记为C ++。

答案 4 :(得分:0)

如果a是结构,则使用a.b

如果a是指向结构的指针,则使用a-> b

如果a是对象指针而b是ivar,则使用a-> b

如果a是对象指针而b是属性,则使用a.b