目标C中的静态数组

Xav*_*ero 9 arrays cocoa static objective-c

我使用以下代码在C#中创建一个公共静态数组

public class A{
    public static array[] obj;
}
Run Code Online (Sandbox Code Playgroud)

我有另一个类B.从类BI调用 A.ArrayName,我得到我在类A中使用的数组.

我想知道,在目标C中,这相当于什么

Abh*_*ert 18

这没有特殊的语法.您只需定义一个类方法来返回静态数组.

例如:

@implementation A // note this is in the implementation

static NSArray *array;

+ (NSArray *)array
{
  if (!array)
    array = [[NSArray alloc] init];

  return array;
}

@end
Run Code Online (Sandbox Code Playgroud)

或者对于更复杂的代码,但性能略好(在紧密循环中是一个好主意,但通常不值得):

@implementation A

static NSArray *array;

+ (void)initialize // this method is called *once* for every class, before it is used for the first time (not necessarily when the app is first launched)
{
  [super initialize];

  array = [[NSArray alloc] init];
}

+ (NSArray *)array
{
  return array;
}

@end
Run Code Online (Sandbox Code Playgroud)

要从课堂上访问它,B您只需:[A array]

  • 如果您需要线程安全初始化并且仍然想要懒惰地执行它,dispatch_once()是一个很好的方法. (2认同)

Vik*_*ica 5

我想建议在NSArray上使用类别.我稍微改变了你的要求,使用NSMutableArray作为共享对象.

接口文件:

#import <Foundation/Foundation.h>

@interface NSArray (StaticArray)
+(NSMutableArray *)sharedInstance;

@end
Run Code Online (Sandbox Code Playgroud)

实施文件

#import "NSArray+StaticArray.h"

@implementation NSArray (StaticArray)

+(NSMutableArray *)sharedInstance{

    static dispatch_once_t pred;
    static NSMutableArray *sharedArray = nil;
    dispatch_once(&pred, ^{ sharedArray = [[NSMutableArray alloc] init]; });
    return sharedArray;
}
@end
Run Code Online (Sandbox Code Playgroud)

现在您可以将其用作:

[[NSArray sharedInstance] addObject:@"aa"];
[[NSArray sharedInstance] addObject:@"bb"];
[[NSArray sharedInstance] addObject:@"cc"];
Run Code Online (Sandbox Code Playgroud)

和其他地方:

NSLog(@"%@", [NSArray sharedInstance]);
Run Code Online (Sandbox Code Playgroud)