A.B的要求是A必须在使用setter或getter之前声明@synthesize 但是A-> B不需要这个。
我不明白哪个更好,哪个使用最少的内存?
如果我从A.B转换为A-> B,它会使用更少的内存还是相同的数量? A-> B使用较少的内存,因为你不需要声明@synthesize,对吧?
答案 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