2010-01-26 130 views
1

使用以下代码我总是得到category.subCategories计数使用Xcode调试儿童阵列总是空

Category *category = [[Category alloc] init]; 
category.title = @"Pubs & Bars"; 
category.icon = @"cat_pubs&bars"; 
category.subCategories == [[NSMutableArray alloc] init]; 

Category *subCategory = [[Category alloc] init]; 
subCategory.title = @"Test Sub Category 1"; 

[category.subCategories addObject:subCategory]; 
为0

使用以下代码中定义的对象:

@interface Category : NSObject { 
    NSInteger *categoryId; 
    NSMutableString *title; 
    NSString *icon; 
    NSMutableArray *subCategories; 
} 

@property(assign,nonatomic,readonly) NSInteger *categoryId; 
@property(nonatomic,copy) NSMutableString *title; 
@property(nonatomic,copy) NSString *icon; 
@property(nonatomic,retain) NSMutableArray *subCategories; 

@end 
+1

您的代码会泄漏内存 - 您需要释放分配给subCategories和subCategory本身的数组,因为您增加了它们的保留计数。 – Vladimir 2010-01-26 12:23:27

+0

谢谢,但这只是一个原型,实际的代码将从SQLite读取数据 – 2010-01-26 13:54:13

+0

为什么不使用Core Data? – bbum 2010-01-26 16:56:34

回答

7

在以下行,category.subCategories == [[NSMutableArray alloc] init];,你有一个双等于,并检查它是否属实。所以subCategories仍然没有在这里,这就是为什么你有一个count为0.

改为使用category.subCategories = [[NSMutableArray alloc] init];

就我个人而言,我会用一个自定义的getter来懒洋洋地创建一个NSMutableArray。在Category.m:

- (NSMutableArray*) subCategories { 
    if (subCategories == nil) { 
     subCategories = [[NSMutableArray alloc] init]; 
    } 
    return subCategories; 
} 

这样,你只需要使用subCategories,因为它已经是存在的,因为它会根据需要创建。这样,你也不会再有泄漏。

+0

正确的问题,但我个人对自定义getter不同意。初始化器用于初始化代码。无需将它扔到地球的四个角落,并在其上创建更多的附加代码。 – Chuck 2010-01-26 12:44:34

+0

我个人认为这很容易。懒惰创作是可可的设计模式之一。它也可以节省记忆(这种说法在这种情况下无关紧要,但有时候可能会是一场巨大的胜利)。 这就是我个人的喜好,在init方法中创建subCategories也是对的。但是,将它想象为“我现在需要它,为什么我不创建它”比“稍后我可能需要它创建它”更容易。 (至少对我来说)。 – gcamp 2010-01-26 12:52:44

+0

我不认为懒惰创作真的是一个可可设计模式。但是,在iPHone上,这可能是一种很好的做法,因为你没有太多的内存可以使用。在较小的设备上保持内存使用总是一个好主意。 – 2010-01-26 13:41:21