self.variable和variable之间的区别

时间:2011-11-06 21:13:11

标签: objective-c instance-variables accessor

  

可能重复:
  Difference between class property mVar and instance variable self.mVar

我是Objective-C开发的新手,我无法弄清楚以下内容之间的区别:

首先让我解释一下我的情况。我有一个NSMutableArray,我在.h文件中创建并插入了它。现在我将数组指定为

self.myMutableArray=myArray

我收到错误;但是只是

myMutableArray=myArray

工作正常。

我对解决错误不感兴趣。我只是想知道将self置于某事之前有什么区别?为什么我能够在没有self的情况下使用变量以及带来什么限制?

2 个答案:

答案 0 :(得分:5)

self.property = value;

等于:

[self setProperty:value];

也就是说,使用self.的声明通过对象的访问器方法,而不是使用直接访问。

他们有不同的原因和影响。也许最值得注意的是,如果不小心使用,直接访问通常会导致引用计数问题(泄漏/僵尸)。访问者负责处理内存管理 - 如果已合成,或者您自己实现它。

一般规则:您应该支持使用访问者(self.blah = thing;)而不是直接访问(blah = thing;),直到您知道何时以及为什么要对此规则进行例外处理

直接异常:一般规则有一个例外:不要在部分构造的状态中使用访问器,例如对象的初始值设定项或dealloc。在这些情况下,请使用直接访问:

- (id)init
{
  self = [super init];
  if (0 != self) {
    things = [NSArray new];
  }
  return self;
}

- (void)dealloc << not needed with ARC, in this case
{
  [things release], things = 0;
  [super dealloc];
}

<强>更新

描述巴伐利亚人对错误的怀疑:

听起来你已经声明了一个实例变量,但是声明了一个相关的属性或适当的访问者(例如setter)。以下是使用ivars和属性的类声明的细分:

@interface MONObject : NSObject
{
@private
  NSMutableArray * myMutableArray; << declares an instance variable
}

// the property declaration:
@property (nonatomic, retain, readwrite) NSMutableArray * myMutableArray;
// adds the accessors:
//   - (NSMutableArray *)myMutableArray; << getter
//   - (void)setMyMutableArray:(NSMutableArray *)arg; << setter
// to the class' interface.

@end


@implementation MONObject

// @synthesize below generates the accessors for the property
// myMutableArray, using "myMutableArray" ivar by default.
@synthesize myMutableArray;

- (void)zumBeispiel
{
  NSUInteger count = 0;

  // direct access:
  count = [myMutableArray count];
  // is equal to:
  count = [self->myMutableArray count];

  // Access via the getter:
  count = [self.myMutableArray count]; << equal to [self myMutableArray]
  // is equal to:
  count = [[self myMutableArray] count];
}

@end

答案 1 :(得分:0)

self.variable是.h文件中定义的属性,如此

@property (retain) NSString *variable;

@synthesize variable;
<。> <。>

而只是“变量”被定义为

@interface MyClass: MyParent {
     NSString *varaible;
}

中的.h