这三种情况有什么不同(所有这些情况都像私人字段一样使用):
1.
@interface APLParseOperation : NSOperation
@property (copy, readonly) NSData *earthquakeData;
@end
2.
@interface APLParseOperation () <NSXMLParserDelegate>
@property (nonatomic) APLEarthquake *currentEarthquakeObject;
@property (nonatomic) NSMutableArray *currentParseBatch;
@property (nonatomic) NSMutableString *currentParsedCharacterData;
@end
3.
@implementation APLParseOperation
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
这是一个很好的做法还是别的什么?
答案 0 :(得分:2)
我将介绍你给出的每个例子并描述它们。我昨天遇到麻烦,所以我感到痛苦。
1
@interface APLParseOperation : NSOperation
@property (copy, readonly) NSData *earthquakeData;
@end
通过使用@property关键字,编译器会自动为您合成访问器方法,以及后备实例变量。但是,因为您使用的是readonly
属性,所以编译器只为您合成一个getter方法。
2
@interface APLParseOperation () <NSXMLParserDelegate>
@property (nonatomic) APLEarthquake *currentEarthquakeObject;
@property (nonatomic) NSMutableArray *currentParseBatch;
@property (nonatomic) NSMutableString *currentParsedCharacterData;
@end
这第二个例子与第一个例子非常相似。但是,因为它们都没有readonly属性属性,所以它们都将为它们合成getter和setter方法,以及后备实例变量。
3
@implementation APLParseOperation
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
对于最后一个示例,您只是声明实例变量。这些也是您的实现文件的私有,其他2个示例在您的类接口文件中进行了声明。
编译器没有为您合成setter或getter方法。您只是声明一些实例变量。
就私有和公共而言,您的第一个和第二个示例都提供了对其他类可见的声明,只要它们导入当前类的头文件即可。但是,第一个示例仅提供了一种“获取”属性并读取它的方法,因为您使用了readonly
属性属性,所以没有setter方法。在第二个示例中,外部类将能够访问属性的getter和setter方法,以便它们可以读写。
对于第三个示例,这些只是实例变量,它们对您的类的实现文件是私有的。基本上,没有外部班级甚至不知道它们存在。
答案 1 :(得分:1)
答案 2 :(得分:1)
案例 1。不是私有的。它是一个公共只读属性:读取是公开的,只能通过底层的ivar在私有范围内写入(感谢指出@mah)。
案例 2。(如果在.m
文件中)通过添加3个私有属性并使协议一致性也是私有的来扩展该类。
案例 3。声明可以在所有实施范围内使用的4个私有实例变量。
私有财产的Objective-C最佳做法是 2。,例如 1。根本不是私有的,只是只读,而 3。使用实例变量(aka ivar),它不如传统属性。更多相关内容:Reason to use ivars vs properties in objective c
希望这有帮助,
答案 3 :(得分:1)
APLParseOperation
类的所有用户可见的公共属性。当您想要公开您的属性时,使用数字1。数字2和3用于私有属性和实例变量。您还可以在类扩展中声明实例变量,如下所示:
@interface APLParseOperation () <NSXMLParserDelegate>
{
NSDateFormatter *_dateFormatter;
BOOL _accumulatingParsedCharacterData;
BOOL _didAbortParsing;
NSUInteger _parsedEarthquakesCounter;
}
@end
它与数字3之间没有太大区别。选择一种风格并在所有代码中坚持使用它是个好主意。