Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标C上的私有字段_Objective C - Fatal编程技术网

Objective c 目标C上的私有字段

Objective c 目标C上的私有字段,objective-c,Objective C,这三种情况的区别是什么(它们都像私有字段一样使用): 1。 @接口操作:NSOperation @财产(副本,只读)NSData*地震数据; @结束 2. @接口解析操作() @不动产(非原子)地震*当前地震对象; @属性(非原子)NSMutableArray*currentParseBatch; @属性(非原子)NSMutableString*currentParsedCharacterData; @结束 3. @操作的实现 { NSDateFormatter*\u日期格式化程序; BOOL_

这三种情况的区别是什么(它们都像私有字段一样使用):

1。
@接口操作:NSOperation
@财产(副本,只读)NSData*地震数据;
@结束
2.
@接口解析操作()
@不动产(非原子)地震*当前地震对象;
@属性(非原子)NSMutableArray*currentParseBatch;
@属性(非原子)NSMutableString*currentParsedCharacterData;
@结束
3.
@操作的实现
{
NSDateFormatter*\u日期格式化程序;
BOOL_累加解析的字符数据;
布尔(BOOL)迪德伯特帕辛;;
NSUInteger(解析DearthQuakeCounter);
}
这是个好习惯还是别的

  • 这不是私人的。它仍然可以被外部类读取,尽管它不能被编写
  • 私人财产。如果您想编写自定义getter和setter,那么它可能很有用。如果您未使用ARC,则它有助于内存管理
  • 私人成员。这是我最喜欢的。它很容易读和写

  • 案例1。不是私人案例。它是一个公共只读属性:读取是公共的,只有在私有范围内通过底层ivar才能写入(感谢您指出@mah)

    Case2.(如果在
    .m
    文件中)通过添加3个私有属性并使协议一致性也私有来扩展类

    Case3.声明了4个私有实例变量,可用于所有实现范围

    Objective-C私有属性的最佳实践是case2。,因为case1。根本不是私有的,只是只读的,case3。使用实例变量(也称为ivar),这比属性更不传统。更多信息请参见:


    希望这能有所帮助,

    我将通读您给出的每个示例,并对它们进行描述。我昨天只是有点麻烦,所以我感觉到了你的痛苦

    一,

    通过使用@property关键字,编译器会自动为您合成访问器方法,以及一个备份实例变量。但是,由于您使用的是
    readonly
    属性,因此编译器只为您合成一个getter方法

    二,

    对于最后一个示例,您只是声明实例变量。这些也是实现文件的私有文件,与其他两个示例一样,在类接口文件中进行了声明

    编译器没有为您合成setter或getter方法。您只需声明一些实例变量

    就private和public而言,第一个和第二个示例都提供了对其他类可见的声明,只要它们导入当前类的头文件。然而,第一个示例只提供了一种“获取”属性并读取它的方法,没有setter方法,因为您使用了
    readonly
    property属性。对于第二个示例,外部类将能够访问属性的getter和setter方法,以便它们可以读写

    对于第三个示例,这些只是实例变量,它们对于类的实现文件是私有的。基本上,没有一个外部班级会知道他们的存在

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

    @interface APLParseOperation () <NSXMLParserDelegate>
    {
        NSDateFormatter *_dateFormatter;
        BOOL _accumulatingParsedCharacterData;
        BOOL _didAbortParsing;
        NSUInteger _parsedEarthquakesCounter;
    }
    @end
    
    @接口操作()
    {
    NSDateFormatter*\u日期格式化程序;
    BOOL_累加解析的字符数据;
    布尔(BOOL)迪德伯特帕辛;;
    NSUInteger(解析DearthQuakeCounter);
    }
    @结束
    

    这和数字3没有太大区别。最好选择一种样式,并在所有代码中坚持使用它。

    1。属性是公共且只读的,不能从类外部更改,但可以随时读取其值,2。它仍然可以从外部读取,也可以从类外部重写,3。从类外部看不到这些内部IVAR。无法通过属性写入案例1属性,但支持值仍然可以写入。也就是说,假设没有自定义命名合成,APLParseOperation类的对象可以运行一个执行“_earthquakeData=[[NSData alloc]init…”的方法,并且它将更改从该属性读取的值。即使在私有范围内,也不可能写入。这一点都不正确,因为可以绕过setter修改属性。这在课堂上是可能的。你是对的,我修改了我的答案来反映这一点。即使在约定和最佳实践方面,您应该尽可能少地使用IVAR。。。
    @interface APLParseOperation : NSOperation
    
    @property (copy, readonly) NSData *earthquakeData;
    
    @end
    
    @interface APLParseOperation () <NSXMLParserDelegate>
    
    @property (nonatomic) APLEarthquake *currentEarthquakeObject;
    @property (nonatomic) NSMutableArray *currentParseBatch;
    @property (nonatomic) NSMutableString *currentParsedCharacterData;
    
    @end
    
    @implementation APLParseOperation
    {
        NSDateFormatter *_dateFormatter;
        BOOL _accumulatingParsedCharacterData;
        BOOL _didAbortParsing;
        NSUInteger _parsedEarthquakesCounter;
    }
    
    @interface APLParseOperation () <NSXMLParserDelegate>
    {
        NSDateFormatter *_dateFormatter;
        BOOL _accumulatingParsedCharacterData;
        BOOL _didAbortParsing;
        NSUInteger _parsedEarthquakesCounter;
    }
    @end