2012-09-09 45 views
1

我从Big Nerd Ranch iOS编程书中获取了这段代码。在代码中,它们分配两个实例变量,即coordinatetitle。为什么直接分配coordinate,并且通过调用setter来设置title为什么二传手被称为一个属性而不是另一个?

头文件

@interface BNRMapPoint : NSObject<MKAnnotation> 

    -(id)initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t; 

    @property(nonatomic, readonly) CLLocationCoordinate2D coordinate; 
    @property(nonatomic, copy) NSString *title; 

@end 

实现文件

-(id)initWithCoordinate:(CLLocationCoordinate2D)c title:(NSString *)t 
{ 
    self = [super init]; 
    if(self){ 
     coordinate = c; 
     [self setTitle:t]; 
    } 
    return self; 
} 

回答

1

两个原因,其中最重要的是,没有为coordinate属性没有setter。它被声明为只读,所以只有一个getter方法生成。

第二是CLLocationCoordinate2D是一个结构,而不是一个对象。有内存管理操作(在这种情况下复制)必须为title对象采取;最简单的方法是使用已经存在的setter方法。编译器负责移动像CLLocationCoordinate2D这样的POD类型的数据。

如果第二个是唯一的原因,不过,这将是一个错误的决定 - 这是不好的风格来使用的setter一个财产,不为别的。

+2

它可以是只读,或者它可以被重新声明为在延伸(这似乎不是)读写。但是,是的......死了。这只是不一致和糟糕的编码风格。删除了我的答案;你的更全面。 – bbum

+0

他可以在私人界面中进行读写,并在公共界面中只读。只有当我真正将事情完全读取时,如果没有直接备份属性的变量,而是发出其他隐藏的内部状态的方式,或者返回值是多个状态之和值等等。这里有一个实际的变量,他设置了......所以为什么不让它自己读写并通过setter?更一致的是,因为他似乎想要做的就是防止人们通过初始化工具来搞乱_coordinate_。 – Metabble

0

There is a school of thought,说你应该复制NSString的。他们正在调用字符串的setter来获取该副本。但是,没有必要复制(甚至保留)坐标,就像Josh指出的那样。

+0

这是不一致的确切来源。 – bbum

相关问题