在方法调用中使用self

时间:2009-11-30 20:57:51

标签: iphone objective-c

当为UITableView使用property / synthesize时,UIButton等应该自包含在该变量的方法调用中吗?以UITableView为例,[self.myTableView visibleCells][myTableView visibleCells]之间有区别吗?或者说[self.myImage setImage:...][myImage setImage:...]

我见过使用self(Bubble Level)的Apple代码以及不使用self的“开始iPhone开发”一书中的示例。我想更好地理解这一点,特别是因为在我的UIScrollView方法调用中使用self导致了不稳定/错误的滚动行为。感谢。

3 个答案:

答案 0 :(得分:2)

使用self.myTableView是另一种说法[self myTableView]的方式(如果在分配语句中使用,它也可以是[self setMyTableView:...];)。换句话说,你正在执行一个方法。

使用myTableView直接访问实例变量。

就个人而言,我通常更喜欢使用前一种方法,因为它通常可以让我免于手动管理内存并让我获得KVO通知的好处。但是,额外的方法调用存在微不足道的开销,您可能希望避免这种情况。

您选择使用哪种风格取决于您,每种方式都有其优点和缺点。

答案 1 :(得分:0)

差异取决于您如何定义属性。例如,假设您有以下内容:

@interface MyObject : NSObject {
   NSObject *memberVariable;
}
@property (nonatomic, retain) NSObject *memberVariable;
@end

@implementation MyObject
    @synthesize memberVariable;
@end

指定(nonatomic, retain)实际告诉@synthesize如何创建getter和setter方法。指定retain会导致setter方法在我传递给它的对象上调用retain。因此,self.memberVariable = someOtherObject相当于memberVariable = [someOtherObject retain];

如果您在属性定义中指定了retain,那么这也是您永远不应该执行self.memberVariable = [[NSObject alloc] init];的原因。 alloc将保留计数初始化为1,将对象传递给setter方法会将保留计数增加到2.

答案 2 :(得分:0)

这取决于您的访问者方法是否具有自定义行为,在这种情况下,您始终希望从类中调用访问者,以及是否要确保生成KVO通知。如果您正在使用库存访问器(例如,合成)并且它不会影响直接从类中访问实例变量的任何内容,那么您将自己保存一个方法调用。