15

我知道它支持自动变量,但是类变量呢?

4

4 回答 4

33

该语言不支持类变量。static您可以在实现的编译单元中使用全局变量来实现特定于类的状态。

在标头(.h 文件)中:

@interface MyClass : NSObject
+(int)val;
@end

在实现中(.m 文件):

static int val = 123;

@implementation MyClass
+(int)val {return val;}
@end

用法:

if ([MyClass val] > 100) ...
于 2012-06-25T10:29:10.750 回答
7

ObjC 类变量是普通的旧静态变量。

Foo.m

static int foo = 0;

或者,如果您使用 ObjC++,则可以使用 C++ 匿名命名空间:

Foo.mm

namespace {
    int foo = 0;
}

但是,如果您想从属性的优势中受益,还有另一种模式:

Foo.h

@interface FooShared

@property ( atomic, readwrite, strong ) Foo* foo;

@end

@interface Foo

+ (FooShared*) shared;

@end

Foo.m

@implementation FooShared
@end

static fooShared* = nil;

@implementation Foo

+ (FooShared*) shared
{
    if ( fooShared == nil ) fooShared = [FooShared new];

    return fooShared;
}

@end

somewhere.m

Foo* foo …;
foo.shared.foo = …;

它可能看起来有点矫枉过正,但这是一个有趣的解决方案。您对实例属性和“类”属性使用相同的结构和语言特性。按需原子性、需要时的访问器、调试、断点……甚至是继承。

我想,创造性思维可以找到其他方法来完成这一切。:) 但是您几乎涵盖了这些选项。

于 2012-06-25T10:45:22.147 回答
5
@property (class, nonatomic, copy) NSString *someStringProperty;

但是你必须提供getter和setter

来自 Xcode 8 发行说明:Objective-C 现在支持类属性,它与 Swift 类型属性互操作。它们被声明为:@property (class) NSString *someStringProperty;。它们永远不会被合成。(23891898)

于 2017-08-10T19:04:00.333 回答
1

Xcode 8.x 中重新添加了类属性。这与您编写自己的 setter 和 getter 作为类方法并使用静态来存储一样多。事实上,这就是它的全部内容,除了编译器消息,见下文。

Objective-C 现在支持与 Swift 类型属性互操作的类属性。它们被声明为@property (class) NSString *someStringProperty;,并且永远不会被合成。(23891898)

https://developer.apple.com/library/archive/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html

@interface MyClass

@property (class) NSObject *someClassProperty;
@property (class, readonly) NSString *aReadClassProperty;

@end

如果您不添加所需的 getter/setter,您将看到以下错误:

类属性 'aReadClassProperty' 需要定义方法 'aReadClassProperty' - 使用 @dynamic 或在此类实现中提供方法实现

类属性 'someClassProperty' 需要定义方法 'setSomeClassProperty:' - 使用 @dynamic 或在此类实现中提供方法实现

类属性 'someClassProperty' 需要定义方法 'someClassProperty' - 使用 @dynamic 或在此类实现中提供方法实现

在您的实施中,您需要:

@implementation MyClass

static NSObject *object;

+ (void)setSomeClassProperty:(NSObject *)someClassProperty {
    object = someClassProperty;
}

+ (NSObject *)someClassProperty {
    return object;
}

static NSString *string = @"My class string";

+ (NSString *)aReadClassProperty {
    return string;
}
于 2019-09-04T06:11:56.993 回答