【问题标题】:What are requirements for using dot notation in Objective C?在 Objective C 中使用点符号有什么要求?
【发布时间】:2017-08-16 11:24:28
【问题描述】:

我想在一个类别中创建一个属性,这样我就可以对访问器使用点表示法。我想这样做的原因是我可以重构一些引用 NSMangedObject 属性的现有代码。然后我会将类别访问器方法放在外部调用者和它们相关的 NSManagedObject 属性之间。 (我不想用消息代替当前的点符号用法,因为我在一个非常大的项目中使用点符号。)

我在类别界面中使用如下属性声明进行了一些实验:

@property NSString* details;

这会导致编译器警告(它不喜欢默认的分配属性。)

由于没有直接与属性绑定的ivar,所以添加retain或copy的属性是没有意义的。

接下来,我只是省略了@property 行,并在接口和实现文件中添加了访问器。

- (void) setDetails:(NSString*)details;
- (NSString*) details;

我编译并运行了代码。我使用点符号测试了这些方法。我可以看到访问器可以成功使用而不会出现错误并且编译器不会抱怨。

我读到的关于点表示法的内容告诉我,如果我以某种方式设置属性,我可以使用点表示法。但我没有设置符合该要求的属性。但看来我仍然可以使用点表示法。

这种方法有什么问题吗?是否有规范定义点符号访问器的使用方式和时间?

【问题讨论】:

    标签: objective-c syntax properties categories


    【解决方案1】:

    点表示法旨在用于声明的属性访问,但实际上编译器对它的处理非常松散,如果您不分配结果,则可以使用任何无参数方法:

     aString.lowercaseString;
     aNumber.intValue;
     aDict.allKeys;
    

    同样,如果对象上存在set<uppercase name>: 形式的单参数方法,编译器将允许您像使用左值一样使用点语法表达式:

    aString.string = @"Amazing";
    aWindow.alphaValue = 0.45;
    

    即使该名称未使用@property 语法声明。

    废话,废话,我猜你已经知道了。目前我能挖掘到的唯一相关文档是TOCPL的这句话:

    但是,当与对象一起使用时,点语法充当“语法糖”——它被编译器转换为对访问器方法的调用。

    【讨论】:

    • 我可以看到这行得通,正如我在问题中提到的那样。但这是否受到规范的支持?如果是这样,我在哪里可以找到规范?如果不支持,风险是代码会在将来的某个编译器版本中中断。
    • 是的,抱歉,我现在正在寻找文档,但我不记得以前看过。
    • 是的,我认为这涵盖了它。没有提到将属性定义为先决条件。只有那个点符号“被编译器转换为访问器方法的调用”。 (例如 [myInstance setValue:10] 和 [myInstance value])。感谢您指向权威来源。
    • 当然,我很高兴为你做到了!
    猜你喜欢
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 2013-06-17
    • 2014-04-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多