我是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
有什么不同?从表示法上我可以推断出它们只是将变量声明为 private 变量,但是它如何工作?如果我是对的。
最佳答案
这是一个愚蠢的命名约定。如果需要,请使用它,否则请不要使用。
优点是方法参数/名为context
的局部变量与ivar _context
不冲突。它与隐私无关,因为您可以仅指定@private来将ivars设为 private (或首先对它们进行@synthesize
编码)。
缺点是您到处都有下划线,下划线在C语言中有时有点特殊(尽管下划线后跟小写字母仅在文件范围内保留,因此如果ivar以小写字母开头,则应该没问题。 )。如有必要,我在结尾处加下划线,以减少脏污。
旁注:少数人使用以下划线开头的方法名称表示“ private ”,但是此约定为reserved by Apple。
关于ios - cocoa 类中变量声明的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6527927/