我敢肯定这是一个简单的方法,但是到目前为止还很遥不可及,我很困惑...

如何声明一个Ivar,以便可以从项目中的所有类对其进行访问?

[不知道这是否重要,但是有问题的ivar是我的Model类的一个实例,它的数据需要由各种 View Controller 访问。

正如我在Objective-C 2.0编程语言中的"The Scope of Instance Variables”所言,这是最好的
...这可以通过使用“@public”指令来实现。

因此,我在声明了ivar的@interface块中尝试了此操作:

@interface ...

...

@public
ModelClass *theModel;

@end

...但是,当我尝试在其他类中引用“theModel”时,编译器不会自动完成,无论如何我键入它时,编译器都会显示:
“错误:未声明'theModel'(此功能首次使用)”。

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

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

最佳答案

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

这是创建Singleton的框架。关键是静态实例和您以[[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;
}

关于iphone - Objective-C中的公共(public)范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1056694/

10-10 13:59
查看更多