gpt4 book ai didi

iphone - iPhone开发中的自语法

转载 作者:行者123 更新时间:2023-12-01 17:45:48 25 4
gpt4 key购买 nike

以下两种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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com