1

如果我有一个属性,比如说一个 NSArray,它只会为我的类的每个实例初始化一次,这有什么问题吗:

(在界面中)

@property(strong, nonatomic)NSArray *bubbleArr;

(在实施中)

-(NSArray*)bubbleArr
{
    if(!bubbleArr)
    {
        NSMutableArray *tempBubbArr = [[NSMutableArray alloc] init];
        // get filepath for first speech bubble image for page
        NSString *speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
                                         [NSString stringWithFormat:@"speech_%i_0", pageIndex]
                                                                        ofType:@"png"];

        for(int i = 1; speechBubbleImgPath; i++)
        {
            UIImage *speechBubbleImg = [[UIImage alloc] initWithContentsOfFile:speechBubbleImgPath];
            UIImageView *speechBubbleImgView = [[UIImageView alloc] initWithImage:speechBubbleImg];

            [tempBubbArr addObject:speechBubbleImgView];

            speechBubbleImg = nil;
            speechBubbleImgView = nil;
            speechBubbleImgPath = nil;

            speechBubbleImgPath = [[NSBundle mainBundle] pathForResource:
                                   [NSString stringWithFormat:@"speech_%i_%i", pageIndex, i]
                                                                  ofType:@"png"];
        }

        bubbleArr = [[NSArray alloc] initWithArray:tempBubbArr];

        tempBubbArr = nil;
    }

    return bubbleArr;
}

我从未使用过自定义访问器方法,但这似乎是一种干净的设置方法,因此我不必在我的viewDidLoad或其他地方设置每个属性,也不必担心它是nil. 我不记得曾经真正遇到过这样做的代码。这是推荐的方法吗?另外,我总是想用它self.bubbleArr来确保调用这个方法,对吧?

4

4 回答 4

2

这是设置您的财产的一种完全有效的方式。Apple 在他们的示例代码以及他们的项目模板中经常做这种事情。例如,查看新创建的核心数据 iOS 项目中的核心数据堆栈设置。正如@WendiKidd 所指出的,您必须始终通过访问器访问您的变量,以确保它运行良好(这可能是您无论如何都应该做的)。

特别是,这是实现类的属性的好方法,该属性实际上只能返回一件事(从您的评论来看,这听起来像是您正在尝试做的事情)。如果这是您的目标,请遵循以下准则:

  1. 将您的财产声明为readonly
  2. 如果它应该是可公开访问的,则在公共标头中声明它,如果它应该是“私有的”,则在 .m 文件的类扩展中声明它
  3. 如果它可以/应该由变量支持,则合成 ivar 并按照您所做的那样覆盖 getter
  4. 如果它不应该/不必由变量支持,请@dynamic在实现中声明该属性并覆盖 getter
  5. 仅通过访问器访问您的 ivar

在第 4 点将变量声明为动态将向查看您的代码的任何人发出信号,表明您可能已经为该属性编写了自定义访问器。

于 2012-05-28T22:25:50.227 回答
1

等待直到您需要变量的内容来初始化它的技术称为“延迟加载”,并且是一种有效的技术。不过,我不确定在吸气剂内部做这件事。

我认为你的帖子的最后一行准确地描述了这个问题——是的,当你想引用对象时,你总是必须确保调用 getter 方法,即使在类本身内部也是如此。很容易犯错误并且不能正确地做到这一点,如果您的代码将来可以传递给另一个开发人员,这是一个特别糟糕的主意。他们绝对不会期望您以这种方式进行设置,并且当他们期望能够正常访问变量时可能会遇到问题。在 viewDidLoad 中初始化成员变量是一种常见且公认的做法。

所以是的——这在技术上是可行的,尽管从设计角度来说不是一个非常合理的设置。我强烈反对它。但如果你只是想知道它是否会起作用,答案是肯定的。

于 2012-05-28T22:22:03.990 回答
0

是的,如果您不使用 self.bubbleArray 或 [self bubbleArray] 您将不会调用该方法。

除此之外,这完全是管理属性实例化的好方法。

于 2012-05-28T22:23:40.537 回答
0

这似乎是一个干净的解决方案,感觉有点像延迟加载。但我不确定我会这样做。

于 2012-05-28T22:23:48.323 回答