iphone - iPhone开发中的自语法

标签 iphone objective-c ios ios4

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

相关文章:

iphone - iOS 4 中 iAd 的示例代码

ios - NSArray 和 NSPredicate 使用 NOT IN

ios - 从方形 AVCaptureVideoPreviewLayer 获取图片

ios - 有没有办法以编程方式更新帧(Swift)

Objective-C : access properties outside of main UI Thread

ios - 更新我的 pod 会导致 GoogleDataTransport Umbrella header 中出现错误

ios - 当 UIButton 调用其选择器操作时获取 EXC_BAD_ACCESS

iphone - 从命令行编译 iOS 字符串文件

iphone - 如何从其他应用程序打开 foursquare iOS 应用程序,并预先填充搜索

objective-c - 如何在运行时确定 NSManagedObject 的子类是否具有特定属性