Objective c 将ivar名称指定给@synthesis是多余的还是良好的做法?

Objective c 将ivar名称指定给@synthesis是多余的还是良好的做法?,objective-c,properties,synthesize,Objective C,Properties,Synthesize,我看了一个例子,老师明确地说,在使用@synthesis时,要始终指定ivar名称,以避免出现问题,例如 @synthesize name = _name; 但是在浏览时,我还没有真正看到这一点,或者在任何其他示例代码中 这让我想到一个问题,为什么需要这样做?仅仅使用带有属性名的@synthesis还不够好吗?这有助于避免任何具体问题吗?这绝对不是多余的,因为@synthesis name=\u name的含义不同于@synthetic name。你是否想将你的IVAR命名为与你的房产不同的名

我看了一个例子,老师明确地说,在使用
@synthesis
时,要始终指定ivar名称,以避免出现问题,例如

@synthesize name = _name;
但是在浏览时,我还没有真正看到这一点,或者在任何其他示例代码中


这让我想到一个问题,为什么需要这样做?仅仅使用带有属性名的
@synthesis
还不够好吗?这有助于避免任何具体问题吗?

这绝对不是多余的,因为
@synthesis name=\u name
的含义不同于
@synthetic name。你是否想将你的IVAR命名为与你的房产不同的名字很大程度上取决于个人偏好。这两种变体都很好。

如果不指定ivar名称,它将使用与属性相同的名称。所以这两个是等价的:

@synthesize name;
@synthesize name = name;
如果您所做的只是
name=name
,那么是的,它完全是多余的


人们之所以指定像
name=\u name
这样的东西,是为了给ivar和属性使用不同的名称。这样做的一个原因是,您不会混淆属性和ivar,但坦率地说,如果您不清楚两者之间的区别,那么这个小小的调整不会拯救您。

这样做的原因是防止直接访问ivar,从而导致内存管理问题。例如:

正确:
self.name=newName
不正确:
name=newName


属性的getter和setter确保正确处理内存管理。要访问IVAR,必须显式键入前导下划线,这很难意外做到。直接访问IVAR的唯一时间是在
init
dealloc
和getter和setter中。

但作为Objective-C的新手,我没有任何个人偏好。我为什么要使用更长的
@synthetic name=\u name?如果我没有自定义getter/setter,它实际上会改变什么吗?我不确定这是因为人们“混淆”了,而不是为了帮助防止错误地使用ivar而不是属性。可能的重复