iOS学习——关于惰性初始化的问题

    代码果然还是要自己动手+动脑码一遍才行。虽然把书看完,把代码码完,但是没动脑,压根没理解里面的变量如何使用。现在学习斯坦福大学的视频,Paul讲得很透彻。在做大作业1的时候遇到2个问题。

1、惰性初始化?

2、为什么NSString不用初始化就可以直接用,而NSArray则要初始化。

先看代码:

m.file:

@property (strong, nonatomic) NSMutableArray *cards; 

- (NSMutableArray *)cards
{
    if (!_cards) _cards = [[NSMutableArray alloc] init];
    return _cards;
}

- (void)addCard:(Card *)card atTop:(BOOL)atTop
{
    if (atTop) {
        [self.cards insertObject:card atIndex:0];
    } else {
        [self.cards addObject:card];
} }

h.file:

@interface Card : NSObject

@property (strong, nonatomic) NSString *contents;

m.file:

 if([card.contents isEqualToString:self.contents]){
        score = 1;
    }


为什么
NSString *contents在使用时可以直接用getter方法self.content,而
NSMutableArray *cards则要先alloc+init?
原因就在于,Objective-C里,所有变量(或属性)刚开始的值都是0(如果是指针则为nil),也就是说,<pre><code></code><pre><code></code>NSMutableArray *cards中cards的值为0,而如果是0的话,下面这个往数组里添加元素的方法是不会起作用的,程序还不知道self.cards是个数组
因为你给nil指针发任何消息都不会其作用,当然也不会使程序崩溃<pre name="code" class="objc">[self.cards insertObject:card atIndex:0];


而注意下面这条消息是要取contents的内容,其实这是个C函数了,所以可以直接调用。
[card.contents isEqualToString:self.contents]

总结:这就是第2个问题的答案,以后留意发消息的时候看指针是否为0,还有数组、字典对象和其他对象的不同。


第一个问题嘛,惰性初始化其实就是不想让属性的初始化太快,或者有些属性没必要一开始就初始化,等到用到的时候才初始化就好,这也是节省内存的一种方式。
那又有另一个问题了,为什么要放在getter中呢?
其实这里放在addcard中也是可以的,只不过为了更方便使用,放在getter方法中时,
如果其他情况下调用self.cards,也能检查指针是否为0,为0则进行分配内存和初始化。
你如果放在addcard中的话,就只具备专用性了。

以上内容参考视频和stackoverflow,总结而得。







 
 
 
 
 
 
 

你可能感兴趣的:(ios开发,惰性初始化)