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.
请赐教.
谢谢你们
在第一个语法中:
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)
总的来说,属性更容易处理保留计数管理,并且是建议的方法,但你必须知道它们的"保留计数"语义并解释它.
我建议这篇文章作为一个有趣的阅读.
| 归档时间: |
|
| 查看次数: |
396 次 |
| 最近记录: |