【问题标题】:Objective-C: what is private what is not?Objective-C:什么是私有的,什么不是?
【发布时间】:2010-12-07 09:01:03
【问题描述】:

人们为什么使用

@interface ViewController : UIViewController 
{
@private
    UIButton* button_;
}

公共标头中的@private 声明?在实现中声明变量会产生相同的结果,不是吗?我觉得很奇怪,我认为公共标头应该只包含真正的公共成员。如何处理受保护的成员?

@implementation ViewController
    UIButton* button_;
@end

我知道的唯一区别是这个变量只在当前编译单元中可见(.m 文件,对吗?)

方法也一样吗?我可以使用正确的方法排序或前向声明进行编译。为什么人们关心为私有方法声明类别?仅用于测试目的?

【问题讨论】:

    标签: objective-c private


    【解决方案1】:

    @implementation 块内的变量声明将创建一个全局变量,而不是实例变量。实例变量需要定义为@interface 的一部分。

    虽然您可以通过类别或扩展创建额外的@interface 块,但它只能包含方法声明,而不能包含实例变量。

    【讨论】:

    • 我认为它们不是,它只是C 声明事物的方式中的一个全局变量。请记住,Objective-CC 的严格超集,因此所有C 规则仍然适用。
    • 我已经确认它是一个全局变量,你是对的。我很惊讶编译器在声明非静态变量 inside @implementation 时没有发出警告
    • 警告你什么?声明一个标准的全局变量?
    • 您不能在单独的接口块中声明它们。只有原始类 @interface 块可以声明实例变量。我认为您可以创建一个类扩展或类别来仅声明其他方法。
    【解决方案2】:

    我会说,虽然将私有实例变量放在所谓的公共标头中可能会让您“感觉”不对,但我不会担心。

    查看 Cocoa 类的几乎所有头文件(集群类除外),您会发现 Apple 在其公共头文件中声明了它们的实例变量。

    由于 Apple 可以接受,我认为您不必担心太多。 =)

    仅供参考:默认情况下,所有实例变量都受到保护。

    【讨论】:

      【解决方案3】:

      方法也一样吗?

      不,方法对程序的任何部分都是可见的。如果你知道选择器,你可以调用它。

      我可以通过正确的方法排序或前向声明编译得很好。为什么人们关心为私有方法声明类别?仅用于测试目的?

      私有类别是前向声明的一种形式。您可以将它们视为 C 原型。

      安德鲁

      【讨论】:

        【解决方案4】:

        @private 仅指 iVar。

        默认情况下,您可以像这样访问实例的 ivars:- id iShouldNotDoThis = foo->bar;

        @private 意味着你不能像那样访问 ivar,必须使用访问方法。

        id thisIsBetter = [foo bar];
        

        与私有类别或方法无关。

        【讨论】:

        • 如果仅在实现文件中声明,我在尝试访问 button_ 时不会收到编译器/链接器错误吗?
        • 它不在实现文件中.. 它在公共标头中,声明为@private
        • 抱歉,我的意思是我的示例 aboce,其中 button_ 在实现文件中声明
        • 啊,我明白了。您拥有的第一个选项就像我在上面描述的那样。第二个选项完全不同,正如 pgb 所说 - 一个 C 全局变量(这并不意味着它是静态的)
        猜你喜欢
        • 2011-05-28
        • 2010-11-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-28
        • 2012-03-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多