self.variable和variable之间的区别

raj*_*ato 1 objective-c accessor instance-variables

可能重复:
类属性mVar和实例变量self.mVar之间的差异

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

首先让我解释一下我的情况.我有一个NSMutableArray,我在我的.h文件中创建并插入它.现在当我为它分配一个数组时

self.myMutableArray=myArray
Run Code Online (Sandbox Code Playgroud)

我收到一个错误; 然而就是

myMutableArray=myArray
Run Code Online (Sandbox Code Playgroud)

工作良好.

我对解决错误不感兴趣.我只是想知道放在self前面有什么区别?为什么我也可以使用变量而没有self带来什么限制?

jus*_*tin 5

self.property = value;
Run Code Online (Sandbox Code Playgroud)

等于:

[self setProperty:value];
Run Code Online (Sandbox Code Playgroud)

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

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

一般规则:您应该倾向于使用accessors(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];
}
Run Code Online (Sandbox Code Playgroud)

更新

描述Bavarious'怀疑错误:

听起来你已经声明了一个实例变量,但是没有声明相关的属性或适当的访问器(例如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
Run Code Online (Sandbox Code Playgroud)