使用点号或者方括号语法设置属性有什么区别吗?

4
在下面的属性声明中,方法(A)和方法(B)是否完全以相同的方式工作?我只是想检查self.yellowViewController = yellcon_New;是否通过我的setter进行操作,以便释放旧对象并保留新对象。
给定以下属性声明,方法(A)和方法(B)是否完全按照相同的方式工作?我只是想检查 self.yellowViewController = yellcon_New; 是否经过了我的setter,以便释放旧对象并保留新对象。
// INTERFACE
@property(nonatomic, retain) YellowViewController *yellowViewController;

// IMPLEMENTATION (A)
self.yellowViewController = yellcon_New;

// IMPLEMENTATION (B)
[self setYellowViewController:yellcon_New];
3个回答

5
所有这些都是正确的:
self.yellowViewController = yellcon_New;

并且
[self setYellowViewController:yellcon_New];

同样的工作。 我想添加一些有趣的内容:当你使用

yellowViewController = yellcon_New;

你可以直接将值与ivar相关联,而无需通过setter方法进行。因此,如果你有以下代码:
-(void)setYellowViewController:(YellowViewController*)theYellowViewController;
{
    NSLog(@"Setting the yellow view controller");
    [yourWife askFor:beer];
    ...whatever...
    ...set the yellowViewController (retain in your case)
}

调用

self.yellowViewController = yellcon_New;

并且

[self setYellowViewController:yellcon_New];

将使用setter方法(记录消息并让你的妻子给你拿些啤酒),

但是,

yellowViewController = yellcon_New;

不会。

在某些情况下,了解这一点是很有趣的。


4

是的,A和B线路的工作方式相同。

您可以通过在此属性的@synthesize而不是使用@dynamic,并将NSLog消息放置在setter方法的实现中来检查它。


3
不需要使用 @dynamic。如果您实现了一个setter方法,编译器将不会生成setter。 - bbum
这很重要,因为您可以使用它来生成getter(如果需要自定义setter)或反之亦然。这对于快速向一个访问器添加日志以进行调试非常有用,而不会改变太多代码。 - andyvn22

1

是的。如果你正在使用@synthesize来为该属性创建setter方法,它会自动为你创建一个-setYellowViewController:方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接