以下两种self
语法访问对象属性的方法有什么区别:
方法1:
self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
方法2:-
effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
effortView
被定义为方法1中寻址为self
的类的属性,并且进行了综合。这两种方法均有效。我在Mac 10.6.6上使用Xcode 4.0 iPhone SDK 4.3。
请赐教。
谢谢你们
最佳答案
在第一种语法中:
self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
您正在通过它们的访问器方法(通常是
effortView
获取,setEffortView
设置)访问这两个ivars。在第二种语法中:
effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
您正在直接通过其属性访问器访问
effortView
时直接访问effortTableView
ivar(指针分配)。区别在于,使用访问器可以获得其他行为。例如,对于
set
属性,由@synthesize
关键字生成的标准retain
访问器:@property (nonatomic, retain) NSObject* property;
您将获得自动保留计数管理(即,保留计数将在分配的对象上自动增加;如果ivar已经有一个值,则指向的对象的保留计数将减少)。这意味着在您的第一个示例中,您造成了2次内存泄漏。实际上,(如果将这些属性声明为
retain
属性)分配给它们将增加其保留计数;但是[[alloc] init]
已经返回了保留计数为1的对象,因此您无需再次增加它。正确的是:self.effortView = [[[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
self.effortView.effortTableView = [[[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped] autorelease];
总体而言,属性使处理保留计数管理变得更加容易,这是进行保留计数管理的建议方法,但是您必须了解其“保留计数”的语义并对此加以考虑。
我建议this article作为有趣的阅读。
关于iphone - iPhone开发中的自语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6212288/