raj*_*ato 1 objective-c accessor instance-variables
我是Objective-C开发的新手,我无法弄清楚以下内容之间的区别:
首先让我解释一下我的情况.我有一个NSMutableArray,我在我的.h文件中创建并插入它.现在当我为它分配一个数组时
self.myMutableArray=myArray
Run Code Online (Sandbox Code Playgroud)
我收到一个错误; 然而就是
myMutableArray=myArray
Run Code Online (Sandbox Code Playgroud)
工作良好.
我对解决错误不感兴趣.我只是想知道放在self前面有什么区别?为什么我也可以使用变量而没有self带来什么限制?
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)
| 归档时间: |
|
| 查看次数: |
1871 次 |
| 最近记录: |