【问题标题】:Global Property in Objective CObjective C 中的全局属性
【发布时间】:2011-12-27 17:17:59
【问题描述】:

我在 Constants.h 文件中以这种方式定义了一个枚举:

typedef enum {
    CalendarTypeMonth = 0,
    CalendarTypeWeek
} CalendarType;

然后在我的视图控制器中,我确定日历类型应该是什么,并以这种方式将其存储在一个属性中:

@property (nonatomic) CalendarType myCalendarType;

现在我希望我项目中的所有类都可以访问日历类型。如何将此属性设置为 global/extern 以便所有类都可以读取?

编辑:我知道枚举的定义将在整个项目中可用。但我感兴趣的是myCalendarType值。如何在所有类中访问 myCalendarType 的值?

【问题讨论】:

  • 要么将其存储在单例中,要么将其存储在您的 AppDelegate 中。
  • 投反对票的人愿意解释一下吗?
  • 哦,有很多可能的原因,我无法开始猜测反对者的想法:1)您的问题与枚举几乎无关,2)您不明白一个属性本质上已经是extern,但是如果不使包含它的对象成为全局对象,就无法使其成为全局对象,3)您显然不熟悉 AppDelegate 和单例,即使您至少应该了解 AppDelegate在开始编码之前学习 iOS。可能还有其他几个。
  • 3) AppDelegate 不用于共享数据或视图控制器之间的通信(尽管您可以将它用于此类事情,但它不是 AppDelegate 的用途)。并且创建一个单例类来共享单个变量是一种矫枉过正。

标签: objective-c ios global-variables


【解决方案1】:

你可以声明类方法来访问静态变量。

将此类代码添加到您的实现文件中:

static MyStaticType staticVar = MyStaticTypeDefault;

+(BOOL)myStaticVar
{
    return staticVar;
}

+(void)setMyStaticVar:(MyStaticType)newValue
{
    staticVar = newValue;
}

并在接口文件中为此方法创建声明。 这比将所有静态值移动到 AppDelegate 要好得多。 无论如何,很多变体都是可能的 - 例如,您可以创建单音来存储应用程序的某些设置或使用 CoreData。

【讨论】:

  • +1 明确的答案有效。另一种解决方案是创建一个单例类。然后你可以做类似if ([MySingletonClass shared].myCalendarType == ...)
  • 这样的静态变量如何被保留/释放等?是否需要明确设置为零?
  • 如果您不指定所有权限定符,它将默认为__strong,并在 ARC 下设置为 nil 时被释放。
  • 是的,请注意将此代码与 MRC 一起使用 - 静态变量在设置时不会被保留,将在某个时候被释放,因此您可以很有趣地寻找意外崩溃的原因
【解决方案2】:

在您的 [项目名称]_Prefix.pch 文件中,您可以添加以下语句:

#import "Constants.h"

这样做,您将使您的枚举可用于项目中的每个文件。

编辑: 要访问该值,我建议将其设为应用程序委托的全局属性。更进一步,您可以让您的应用程序使用类别委托 NSObject 的方法,使其看起来像这样:

CalendarType current = [self appDelegate].currentCalendarType

请注意,您的属性现在是全局可获取/可设置的属性。

【讨论】:

  • 这比我将其全球化的答案更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-01
  • 2015-04-26
  • 2011-06-10
  • 2012-01-07
相关资源
最近更新 更多