1

我从 Big Nerd Ranch iOS Programming 一书中获取了这段代码。在代码中,他们分配了两个实例变量,coordinate并且title. 为什么coordinate直接赋值,title调用setter来设置?

头文件

@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;
}
4

2 回答 2

1

coordinate两个原因,其中最重要的是该属性没有设置器。它被声明为只读的,因此只生成了一个 getter 方法。

第二个是它CLLocationCoordinate2D是一个结构,而不是一个对象。必须为title对象执行一些内存管理操作(在本例中为复制);实现这一点的最简单方法是使用已经存在的 setter 方法。编译器负责移动 POD 类型的数据,例如CLLocationCoordinate2D.

但是,如果第二个原因是唯一的原因,那么这将是一个糟糕的决定——将 setter 用于一个属性而不用于另一个属性是不好的风格。

于 2012-09-09T21:16:19.527 回答
0

有一种观点认为你应该复制 NSStrings。他们正在调用字符串上的 setter 来获取该副本。然而,正如 Josh 指出的那样,没有必要复制(甚至保留)坐标。

于 2012-09-09T21:18:35.287 回答