可能重复:
Difference between class property mVar and instance variable self.mVar
我是Objective-C开发的新手,我无法弄清楚以下内容之间的区别:
首先让我解释一下我的情况。我有一个NSMutableArray
,我在.h文件中创建并插入了它。现在我将数组指定为
self.myMutableArray=myArray
我收到错误;但是只是
myMutableArray=myArray
工作正常。
我对解决错误不感兴趣。我只是想知道将self
置于某事之前有什么区别?为什么我能够在没有self
的情况下使用变量以及带来什么限制?
答案 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