Cocoa类中变量声明的差异

时间:2011-06-29 22:18:02

标签: ios xcode cocoa-touch

我是iOS开发的新手,我已经在几个教程中看到了以下内容,以及Xcode在为我的一个类创建子类时为我自动生成代码。假设我有以下.h和.m文件

#import <UIKit/UIKit.h>

@interface Class : NSObject {
    NSArray *_infos;
    NSString *_context;
}

@property (nonatomic, retain) NSArray *infos;
@property (nonatomic, retain) NSString *context;

@end

#import "Class.h"

@implementation Class

@synthesize infos = _infos;
@synthesize context = _context;

@end

然后考虑这就是我通常会这样做的方式:

#import <UIKit/UIKit.h>

@interface Class : NSObject {
    NSArray *infos;
    NSString *context;
}

@property (nonatomic, retain) NSArray *infos;
@property (nonatomic, retain) NSString *context;

@end

#import "Class.h"

@implementation Class

@synthesize infos;
@synthesize context;

@end

有什么区别?从符号我可以推断他们只是将变量声明为私有,但它是如何工作的?如果我是对的。

2 个答案:

答案 0 :(得分:4)

这是一个愚蠢的命名惯例。如果你愿意,可以使用它,如果不愿意,可以使用它。

优点是名为context的方法参数/局部变量不与ivar _context冲突。它与隐私无关,因为您可以指定@private将ivars设为私有(或者首先只放置@synthesize个。)

缺点是你到处都有下划线,并且下划线偶尔会在C中有点特殊(虽然下划线后面跟一个小写字母只保留在文件范围内,所以你应该提供ivar以小写字母开头......)。如有必要,我会在 end 处加上一个下划线,感觉不那么脏。

旁注:有些人使用以下划线开头的方法名称来表示“私有”,但此惯例为reserved by Apple

答案 1 :(得分:0)

唯一的区别是保存属性的ivars(“实例变量”)的名称。