目标C上的私有字段

时间:2014-06-24 16:19:53

标签: objective-c

这三种情况有什么不同(所有这些情况都像私人字段一样使用):

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;
}

这是一个很好的做法还是别的什么?

4 个答案:

答案 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)

  1. 这不是私密的。它仍然可以被外部类读取,但它无法写入。
  2. 私有财产。如果要编写自定义getter和setter,它会很有用。如果您使用ARC,则可能对内存管理有所帮助。
  3. 私人会员。这是我最喜欢的。它易于阅读且易于编写。

答案 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)

  1. 定义了对APLParseOperation类的所有用户可见的公共属性
  2. 通过扩展定义属性,使它们仅可用于实现方法。
  3. 定义实例变量,它们是隐式私有的。
  4. 当您想要公开您的属性时,使用数字1。数字2和3用于私有属性和实例变量。您还可以在类扩展中声明实例变量,如下所示:

    @interface APLParseOperation () <NSXMLParserDelegate>
    {
        NSDateFormatter *_dateFormatter;
        BOOL _accumulatingParsedCharacterData;
        BOOL _didAbortParsing;
        NSUInteger _parsedEarthquakesCounter;
    }
    @end
    

    它与数字3之间没有太大区别。选择一种风格并在所有代码中坚持使用它是个好主意。