Objective-C是否支持类变量?

时间:2012-06-25 10:26:03

标签: objective-c class-variables

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

4 个答案:

答案 0 :(得分:26)

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

在标题(.h文件)中:

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

在实现(.m文件)中:

static int val = 123;

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

用法:

if ([MyClass val] > 100) ...

答案 1 :(得分:5)

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 = …;

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

创造性思维可以找到其他方法来做这一切我想。 :)但你几乎已经满足于这些选择。

答案 2 :(得分:3)

@property (class, nonatomic, copy) NSString *someStringProperty;

但你必须提供getter和setter

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

答案 3 :(得分:0)

Class属性重新添加到Xcode 8.x中。它只不过是您编写自己的setter和getter作为类方法,并使用静态变量进行存储而已。实际上,仅此而已,除了编译器消息,请参见下文。

  

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

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

<?php
$percentStart = 5;
$percentEnd = 75;
$numberStart = 5;
$numberEnd = 200;
$eps = 1.E-9;
$results=[];
for($percent = $percentStart; $percent <= $percentEnd; $percent++){
  for($number = $numberStart; $number <= $numberEnd; $number++){
    $percentFromNumber = $percent * $number/100;
    if(fmod($percentFromNumber,1) < $eps){
      $results[] = [
        'percent' => $percent,
        'number'  => $number,
        '%number' => $percentFromNumber
      ];
    }
  }
}
var_dump($results);

如果您未添加所需的获取/设置程序,则会看到以下错误:

  

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

     

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

     

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

在您的实现中,您需要:

@interface MyClass

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

@end