如何惰性初始化NSMutableArray?

3

我该如何懒惰地初始化一个包含按钮的NSMutableArray?我可以像这样做:

-(NSMutableArray *)roasteryButtons
 {
     if(!roasteryButtons)
     {
     roasteryButtons = [ NSMutableArray new];
     //other code
     }
return roasteryButtons;
 }

你不知道如何调用这个懒惰的初始化器吗?也就是说,我需要初始化数组,以便为数组中的每个按钮设置框架。

4个回答

2
我猜你知道什么时候调用这个方法,对吧?
首先,你不应该使用 "new" 方法,而是应该使用 [[NSMutableArray alloc] init] :你应该查看所有现有的 NSArray [Init] 方法:有很多(带容量、带对象等)。
无论如何,你应该为你的方法 [roasteryButtons] 添加一些参数:这些参数将帮助该方法了解需要创建多少个按钮,它们要显示在哪个框架中等。因此,这会有点像:
-(NSMutableArray *)roasteryButtonsWithFrame:(*Frame) andNumbersOfButtons:(int)

例如...
或者,您可以传递对委托的引用,该委托将能够回答这些问题(有多少个按钮,我的框架和边界是什么等),而不是参数。因此,在这种情况下,该方法将如下所示:
-(NSMutableArray *)roasteryButtonsWithDelegate:(id) 

(该委托应实现一个由您创建的协议,包含委托将必须响应的不同方法。例如,像[howManyButtons]这样的方法...)

(这个委托应该实现一个你创建的协议,其中包含委托需要响应的不同方法,比如[howManyButtons]...)

使用 new 没有问题,参见 https://dev59.com/tnRB5IYBdhLWcg3wF0HH。 - mvds
1
不,我知道,我只是提到这个因为可能他并不是真正做出了这个决定,而是从另一种面向对象的语言中养成的习惯。简单初始化的变体通常非常有用。 - Rabskatran
好的。但是为什么 numberofbuttons 不只是一个 int,或者更好的是 NSInteger,甚至更好的是 NSUIntegerint 是古老语言的习惯;-) - mvds

2
您所做的是正确的。您没有在类的init方法中分配数组,而是只在需要时分配数组。因此,它实现了惰性分配的目的。
在这个类中,无论何时需要使用数组,只需调用:
NSMutableArray *arr = [self roasteryButtons];

同时在头文件中声明该方法,如下所示:-(NSMutableArray*)roasteryButtons;

如果你想在其他类中引用该数组,则可以像这样调用:

[classObj roasteryButtons];

我已将其显示为实例方法。如果您希望这样,也可以将其声明为类方法。

并在-(void)dealloc方法中释放它。


1
完美的惰性初始化方式如下所示:
在.h文件中将您的NSMUtableArray声明为属性,如下所示:
@property(nonatomic,strong)NSMutableArray *array;
现在,在.m文件中合成它,并在getter中进行惰性初始化,如下所示:
@synthesize array = _array;
(NSMutableArray *)array { (!_array) _array = [[NSMutableArray alloc] init]; //这行代码被称为惰性初始化。这行代码将在程序运行时创建MutableArray。
返回_array }
现在回答为什么我们需要这个是因为它会注意到如果没有创建NSMutableArray,则会在程序运行时创建它,这样您的应用程序将不会崩溃。

0
你可以将你的方法变成一个类方法:
+(NSMutableArray *)roasteryButtons {

这样你就可以像这样调用它:

[MyRoasteryButtonClass roasteryButtons];

这将会返回您的对象。

希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接