代码之家  ›  专栏  ›  技术社区  ›  ron

Objective-C中的公共范围?

  •  5
  • ron  · 技术社区  · 17 年前

    我相信这是一个简单的,但它一直难以捉摸到目前为止,我难以捉摸。。。

    如何声明Ivar,以便项目中的所有类都可以访问它?

    就我所知,这是最好的 "The Scope of Instance Variables” 在里面 Objective-C2.0编程语言 ... 这可以通过使用–ofœ@public–of指令实现。

    因此,我在声明ivar的@interface块中尝试了这一点:

    @interface ...
    
    ...
    
    @public
    ModelClass *theModel;
    
    @end
    

    ... 但是,当我尝试在另一个类中引用模型时,编译器不会自动完成,并且当我无论如何键入它时,编译器会显示: 错误:模型未声明(首次在此函数中使用)。

    我假设这是一个范围问题,并且我没有适当地提供ivar,但是如何提供呢?我需要以某种方式访问它,或者以某种方式使其指针可用。

    任何想法都将不胜感激。非常感谢!

    6 回复  |  直到 17 年前
        1
  •  5
  •   newacct    17 年前

    也许您忘了将实例变量放在类的大括号中,所有实例变量声明都放在大括号中?

    @interface Foo : NSObject {
    
        // other instance variable declarations
    
        @public
        ModelClass *theModel;
    }
    
    // method and property declarations
    
    @end
    

    另外,您可以向我们展示如何尝试从其他地方访问实例变量的代码吗?正确的语法应该是:

    myFooInstance->theModel
    

    哪里 myFooInstance Foo * "

        2
  •  3
  •   Kendall Helmstetter Gelner    17 年前

    您不能从任何其他类访问IVAR。

    您必须声明一个getter/setter方法来更改或查看另一个类中的变量-您真正需要的是属性,这些属性使定义和访问这些getter/setter方法变得更容易。

    @property (nonatomic, retain) ModelClass *theModel;
    

    在实现文件中,您将在@implementation行之后使用@synthesis语句创建getter/setter:

    @synthesize theModel;
    

    然后,如果创建了类的实例,则可以访问类实例变量,如下所示:

    myInstance.theModel = [[[ModelClass alloc] init] autorelease];
    

    原因是什么@private用于定义子类的可见性(作为该类类型的扩展,它还可以获得由超类定义的所有类局部变量),而不是任何随机类的可见性。

        3
  •  3
  •   MystikSpiral    17 年前

    我通过一个表示我的数据模型的单例,使属性可用于由选项卡栏管理的所有视图。这是高效的,允许所有视图访问数据(以及任何其他应用程序元素)。创建单例非常简单(S.O.上有大量示例)。您只需请求实例并获取所需的属性值。

    下面是一个创建单例的框架。关键点是静态实例和您按如下方式进行初始化的事实 [[self alloc] init]; . 这将确保正确清理对象。类底部的所有方法都是SDK文档中的标准方法,以确保忽略发布调用(因为对象是全局共享的)。

    单例样板(ApplicationSettings.m):

    static ApplicationSettings *sharedApplicationSettings = nil;
    
    + (ApplicationSettings*) getSharedApplicationSettings
    {
        @synchronized(self) {
            if (sharedApplicationSettings == nil) {
                [[self alloc] init]; // assignment not done here
            }
        }
        return sharedApplicationSettings;
    }
    
    + (id)allocWithZone:(NSZone *)zone
    {
        @synchronized(self) {
            if (sharedApplicationSettings == nil) {
                sharedApplicationSettings = [super allocWithZone:zone];
                return sharedApplicationSettings;  // assignment and return on first allocation
            }
        }
        return nil; //on subsequent allocation attempts return nil
    }
    
    - (id)copyWithZone:(NSZone *)zone
    {
        return self;
    }
    
    - (id)retain
    {
        return self;
    }
    
    - (unsigned)retainCount
    {
        return UINT_MAX;  //denotes an object that cannot be released
    } 
    
    - (void)release
    {
        //do nothing
    }
    
    - (id)autorelease
    {
        return self;
    }
    
        4
  •  1
  •   cobbal    17 年前

    标准的Objective-C方法是使用一个返回ivar的类方法

    在.h文件中:

    + (id)defaultModel;
    

    static ModelClass * defaultModelInstance;
    
    @implementation ModelClass
    
    + (id)defaultModel {
        if (!defaultModelInstance) {
            defaultModelInstance = [[ModelClass alloc] init];
        }
        return defaultModelInstance;
    }
    
    @end
    

    虽然如果你需要一个特定的ivar而不是“一个总是一样的ivar”,这需要调整

    这种类型的设计被许多可可类使用,例如。 [NSWorkspace sharedWorkspace]

        5
  •  0
  •   CynicismRising    17 年前

    考虑一个C全局变量。

    添加:
    extern ModelClass* theModel;
    之后 @end 在标题中,将使变量在包含标题的任何位置可见。

    在ModelClass.cpp文件中添加:
    ModelClass* theModel;

    在您分配并初始化变量之前,该变量的值仍然为nil,您将负责确保它在正确的时间被释放。

        6
  •  0
  •   rondoagogo    17 年前

    感谢大家就这个话题进行了非常有益的讨论!很明显,这里有几种方法,所以这是一种非常有用的技术组合。


    为了让大家都知道,在进一步研究这个问题时,我浏览了下面列出的几个非常有用的页面。其中包括提到NSNotificationCenter,这是我以前从未听说过的;以及“依赖注入”设计模式的思想。

    其思想是保持类之间的“低耦合”(1),使代码更加模块化;更好地进行单元测试。

    最后,尽管“@public”编译器指令在苹果的 Obj-C 指南(2),我后来在另一份文件中发现了一条迷人的法令,声明 ! 引自苹果自己的

    (奇怪的是,他们在“Objective-C2.0”指南中没有提到这一点,而该指南实际上解释了该指令。)

    • S.O.: “最好的方法是什么 沟通 视图控制器?” (4) <&书信电报;

    • CocoaWithLove: “五种解决办法 倾听、观察和通知 可可” (5)

    • CocoaWithLove: “单身人士, (6)


    最好的

    祝你好运!它不允许我发布多个内联超链接,所以我在这里列出它们。显然,它们的前缀都是http://……:O

    (1) :en.wikipedia.org/wiki/Coupling(计算机科学)
    (2) :developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/Articles/ocDefiningClasses.html#//苹果%5Fref/doc/uid/TP30001163-CH12-TPXREF127
    (3) :developer.apple.com/documentation/Cocoa/Conceptual/CocoaFundamentals/AddingBehaviorToCoaProgram/AddingBehaviorCocoa.html#//apple_ref/doc/uid/TP40002974-CH5-SW12
    (4) :stackoverflow.com/questions/569940/whats-the-best-way-to-communication-between-viewcontrollers
    (5) :cocoawithlove.com/2008/06/five-approach-to-listing-observing.html
    (6) :cocoawithlove.com/2008/11/singletons-appdelegates-and-top-level.html