self on property:在同一代码中有或没有self

时间:2011-07-27 19:59:38

标签: objective-c properties

  

可能重复:
  Difference between calling self.var vs var

编辑:实际上,我不明白将数组添加到数组不需要“setter”,但实际上是“getter”,所以使用“self”并不重要。

你能告诉我为什么在这段代码中我们有时使用“自我”。有时候我们不这样做:如果我们有一条“消息”要发送到属性,我们通常使用“self。”,但是在这里的locationManager委托中,我们不使用它:

- (void)viewDidLoad {
    self.locationMeasurements = [NSMutableArray array];
}

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
    [locationMeasurements addObject:newLocation];

- (void)viewDidUnload {
    locationDetailViewController = nil;
}


- (void)reset {
    [self.locationMeasurements removeAllObjects];
}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

当你使用self时,你会通过访问器方法,从而在分配时利用非原子(或原子)等属性属性,或者在分配时复制,保留,分配。

如果不使用self,则直接访问变量。

示例:

@interface X : NSObject
{
    NSObject * anObject;
}
@property(nonatomic,retain) NSObject * anObject;

self.anObject = [[NSObject alloc]init]autorelease];

会将对象保留在属性

anobject = [[NSObject alloc]init]autorelease];

不会保留它,该对象将在稍后发布。

自我。是语法糖:

-(NSObject *)anObject;

and

-(void)setAnObject:(NSObject *)other;

属性声明中的属性定义了如何在幕后实现这些方法

在viewDidLoad中的示例代码中自我。可能需要确保在分配后保留数组。但是在“重置”中可能不需要它,因为你只是操纵对象本身而不是对属性的赋值(除非你处理多线程和原子访问器)。

有一点需要注意的是,如果你在ViewDidLoad(MutableArray)中创建一些东西,你应该在viewDidUnload中销毁它(self.locationMeasurements = nil;)

答案 1 :(得分:0)

使用self.时,您可以获得@property声明的所有好处。这包括内存管理(复制,保留,分配和释放)和原子性。当不使用self并且存在具有相同名称的实例变量时,您将失去优势,这在分配变量时尤其有效。例如,如果viewDidUnload被声明为locationDetailViewControllercopy,则retain会导致泄密,因为您没有使用自我。