代码之家  ›  专栏  ›  技术社区  ›  Grant Park

@private variable in.h或空category variable in.m之间的差异[重复]

  •  0
  • Grant Park  · 技术社区  · 7 年前

    另外,可以在头中声明私有属性吗?

    0 回复  |  直到 11 年前
        1
  •  2
  •   Darren    11 年前

    在头文件中声明@private ivar和在没有@private的类扩展中声明相同的ivar有什么区别?

    1) 类的main中声明的实例变量 @interface 块可用于外部类类别或扩展,即使这些变量已声明 @private

    // YourClass.h
    @interface YourClass : NSObject {
        @private
        int _yourPrivateIVar; 
    }
    @end
    
    // MyExtension.m
    @implementation YourClass(MyExtension)
    - (void)reset { _yourPrivateIVar = 0; } // This is allowed.
    @end
    

    在实现中声明的实例变量不可用于外部类类别。

    @接口 ,即使两个ivar都是 . E、 g.这是不允许的:

    @interface Base : NSObject
    {
        @private
        int _foo;
    }
    @end
    
    @interface Subclass : Base
    {
        @private
        int _foo; // Error: Duplicate member _foo
    }
    @end
    

    如果两个ivar都是在一个类扩展或实现块中声明的,那么它不仅可以编译,而且可以按预期工作:两个类都有各自独立的 _foo 互不冲突的ivar。换句话说,这两个变量都是真正的私有和独立的:

    @implementation Base {
        int _foo;
    }
    @end
    
    @implementation Subclass {
        int _foo;
    }
    - (void)reset { _foo = 123; } // Does not affect base class's _foo
    @end
    

    注意:如果基类和子类声明了一个同名的“private”属性或方法,它将在编译时不会出现警告或错误,但在运行时会出现异常失败,因为这两个类在不知不觉中会干扰彼此的私有数据。

        2
  •  3
  •   zaph    11 年前

    其概念是只在头文件中声明那些公共的东西(方法、属性等)。声明实现文件的类扩展名中的所有私有项。

    这样,开发人员可以自由地更改头文件中未公开的任何内容,而不必进行任何外部可见的更改。

    在Objective的最新版本中,它最终可以通过类扩展完全发布。