iPhone开发中的自我语法

Soc*_*cus 1 iphone objective-c ios4 ios

以下两种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];
Run Code Online (Sandbox Code Playgroud)

方法2: -

    effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
Run Code Online (Sandbox Code Playgroud)

effortView被定义为一个属性,并合成到类编址为self方法1.这两种方法都有效.

我在Mac 10.6.6上使用Xcode 4.0 iPhone SDK 4.3.

请赐教.

谢谢你们

ser*_*gio 5

在第一个语法中:

self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
Run Code Online (Sandbox Code Playgroud)

你通过他们的访问方法访问两个ivars(通常,effortView获取,setEffortView设置).

在第二种语法中:

effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];
Run Code Online (Sandbox Code Playgroud)

您正在通过其属性effortView访问器访问时直接访问ivar(指针赋值)effortTableView.

不同之处在于使用访问器可以获得其他行为.就像,使用属性set@synthesize关键字生成的标准访问器retain:

@property (nonatomic, retain) NSObject* property;
Run Code Online (Sandbox Code Playgroud)

您将获得自动保留计数管理(即,保留计数将在指定的对象上自动递增;如果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];
Run Code Online (Sandbox Code Playgroud)

总的来说,属性更容易处理保留计数管理,并且是建议的方法,但你必须知道它们的"保留计数"语义并解释它.

我建议这篇文章作为一个有趣的阅读.