Objective C静态类variables
我是Objective C的新手,正在阅读一本名为“Visual Quickstart Guide:Objective-C”的书,由Steven Holzner,Peachpit Press
在第6章:面向对象编程中,有一个名为Using Class Variables的部分,他写道:
您可以创build类variables以供您的类使用,但有一个问题:该类的每个对象共享相同的variables,因此,如果一个对象更改了一个类variables,则该variables将针对所有对象进行更改。 您可以使用static关键字创build类variables。 类variables通常很有用:例如,您可以使用类variables来跟踪程序中创build的特定类的对象数量。 你会在这个任务中做到这一点。
并说input下面的代码:
#import <stdio.h> #import <Foundation/NSObject.h> @interface TheClass: NSObject static int count; //error: cannot declare variable inside @interface or @protocol +(int) getCount; @end ...
这段代码在Xcode 4中给我一个错误:
无法在@interface或@protocol中声明variables
这本书是错的还是我做错了什么?
您在实现文件( .m
文件)中声明静态variables。 这应该工作:
// TheClass.h @interface TheClass : NSObject + (int)count; @end // TheClass.m static int theCount = 0; @implementation TheClass + (int) count { return theCount; } @end
这本身不是一个类variables。 Objective-C没有类variables的概念。 但是,与用于检索此variables的类方法结合使用,其function类似于类variables。 但是,它实际上只是一个C静态variables,可以通过类的实现来访问。
我见过一个有关Unix的Visual快速入门指南,它吸引了大量的时间。 至less从样本来看,这似乎并没有好多less。 在Objective-C中创build类variables的正确方法如下所示:
// Counted.h @interface Counted : NSObject + (NSUInteger) numberOfInstances; @end // Counted.m #import "Counted.h" static NSUInteger instances = 0; @implementation Counted - (id) init { … instances++; … } - (void) dealloc { instances--; } + (NSUInteger) numberOfInstances { return instances; } @end
这实际上是一个静态variables,而不是一个真正的类variables。 但是,你不应该担心类variables太多,它们通常表明你做错了什么。 (我简单一点,但不多。)
如果你正在寻找一个体面的Objective-C书籍,请阅读苹果的书 。 这是免费的,这是一个很好的阅读。
如果“类variables”需要的不仅仅是简单的初始化,使用dispatch_once
:
@interface Foo () + (Foo *)singleton; @end + (Foo *)singleton { static Foo *_singleton; static dispatch_once_t oncePredicate; dispatch_once(&oncePredicate, ^{ _singleton = [[Foo alloc] init]; }); return _singleton; }
您应该在放置@implementation的.m文件中声明该variables。 所以,
#import "TheClass.h" static int count; @implementation ... @end
注意到Objective-C实际上不支持类variables是很重要的。 但是你可以用静态variables来模拟它们,就像我们在这里所做的那样。