Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/110.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
面向初学者的变量赋值和字符串数组Obj-c(iOS)_Ios_Objective C_String_Variables - Fatal编程技术网

面向初学者的变量赋值和字符串数组Obj-c(iOS)

面向初学者的变量赋值和字符串数组Obj-c(iOS),ios,objective-c,string,variables,Ios,Objective C,String,Variables,我创建了一个单视图应用程序,添加了一个标签、一个不可编辑的文本视图和一个按钮,我有一个字符串数组。实际上,只需单击按钮并随机更改字符串 - (IBAction)viewNextPressed:(id)sender { NSArray *affirmationStrings = @[ @"String 1 Pressed", @"String 2 Pr

我创建了一个单视图应用程序,添加了一个标签、一个不可编辑的文本视图和一个按钮,我有一个字符串数组。实际上,只需单击按钮并随机更改字符串

- (IBAction)viewNextPressed:(id)sender {
    NSArray *affirmationStrings = @[
                                   @"String 1 Pressed",
                                   @"String 2 Pressed",
                                   @"String 3 Pressed"
                                   ];

    //Generate a random index from our array
    int randomNIndex = arc4random() % [affirmationStrings count];

    //Display a string from our array
    self.displayAffirmationText.text = affirmationStrings[randomNIndex];

}

@end
显然,这在本例中效果很好,但其效率极低,因为每次单击按钮时都会生成数组。哪里是存储阵列的最佳位置,以便在加载时生成阵列,并且我可以在需要时访问阵列


我看到viewDidLoad,但作为一名初学者,我想尝试了解简单任务的最佳实践。第二,我存储字符串的方式是否适用于大样本(例如500-1k+字符串)?

对于数量相对较少的字符串,更好的选择是:

  • 向类中添加属性或实例变量
  • init
    方法中初始化所述属性或实例变量,或者在视图控制器的情况下,在
    viewDidLoad
    中初始化所述属性或实例变量
因此,对于实例变量: 然后通过
\u
引用它

对于其他类可见的只读属性,具有延迟初始化: 在h中: In.m: 然后通过
self.strings
引用它

还有其他方法可以使其读/写(因此可以从另一个类中设置值),或者仅在类中可见,等等

如果您想处理大量字符串,您可能至少希望将列表移到代码之外的外部文件(文本文件、JSON、XML、plist…)中。然后,您可以立即从那里加载并保留它,或者根据需要加载它(一旦不再需要它,就忘记它,因此如果再次需要它,就重新加载它)

您还可以通过核心数据或直接使用SQLite将数据存储在数据库中


这完全取决于您的目标/要求。

对于数量相对较少的字符串,更好的选择是:

  • 向类中添加属性或实例变量
  • init
    方法中初始化所述属性或实例变量,或者在视图控制器的情况下,在
    viewDidLoad
    中初始化所述属性或实例变量
因此,对于实例变量: 然后通过
\u
引用它

对于其他类可见的只读属性,具有延迟初始化: 在h中: In.m: 然后通过
self.strings
引用它

还有其他方法可以使其读/写(因此可以从另一个类中设置值),或者仅在类中可见,等等

如果您想处理大量字符串,您可能至少希望将列表移到代码之外的外部文件(文本文件、JSON、XML、plist…)中。然后,您可以立即从那里加载并保留它,或者根据需要加载它(一旦不再需要它,就忘记它,因此如果再次需要它,就重新加载它)

您还可以通过核心数据或直接使用SQLite将数据存储在数据库中


这完全取决于您的目标/要求。

如果您不想重新创建数组,可以将其存储在实现
-viewNextPressed:
的类上的实例变量中。这可能是最简单也是最好的解决方案,假设您没有数量惊人的字符串,并且字符串相当短。如果存在VC的多个实例,您可能会考虑静态实例变量。谢谢答复,我目前只使用默认的VIEWController类。如何将其实现到ViewController.h中?最好添加一个属性。您需要的代码行是
@property(非原子,强)NSArray*字符串
然后在
-viewDidLoad
中设置数组,就像在方法中一样,但使用
\u assignmentstrings
而不是
NSArray*assignmentstrings
。我强烈建议您查看一下,以便准确了解它的含义和作用,如果您还不了解属性如果您想避免重新创建数组,可以将其存储在实现
-viewNextPressed:
的类上的实例变量中。这可能是最简单也是最好的解决方案,假设您没有数量惊人的字符串,并且字符串相当短。如果存在VC的多个实例,您可能会考虑静态实例变量。谢谢答复,我目前只使用默认的VIEWController类。如何将其实现到ViewController.h中?最好添加一个属性。您需要的代码行是
@property(非原子,强)NSArray*字符串
然后在
-viewDidLoad
中设置数组,就像在方法中一样,但使用
\u assignmentstrings
而不是
NSArray*assignmentstrings
。如果您还不了解属性,我强烈建议您查看一下,以便准确理解它的含义和作用
@implementation MyViewController
{
    NSArray *_affirmationStrings;
}

...

- (void)viewDidLoad
{
    [super viewDidLoad];
    _affirmationStrings = @[ ... list of strings ... ];
}
@interface MyViewController : UIViewController

@property (readonly) NSArray *affirmationStrings

@end
- (NSArray *)affirmationStrings
{
    if (!_affirmationStrings)
        _affirmationStrings = @[ ... list of strings ... ]
    return _affirmationStrings;
}