Iphone 子数组始终为空

Iphone 子数组始终为空,iphone,objective-c,Iphone,Objective C,使用以下代码,我总是使用Xcode调试器将category.subCategories计数设置为0 Category *category = [[Category alloc] init]; category.title = @"Pubs & Bars"; category.icon = @"cat_pubs&bars"; category.subCategories == [[NSMutableArray alloc] init]; Category *subCategory

使用以下代码,我总是使用Xcode调试器将category.subCategories计数设置为0

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];
使用以下代码定义的对象:

@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

在下一行中,
category.subCategories==[[NSMutableArray alloc]init],您有一个双等号,并检查它是否为真。所以子类别在这里仍然为零,这就是为什么
count
为0

使用
category.subCategories=[[NSMutableArray alloc]init]取而代之

就我个人而言,我会使用一个自定义getter惰性地创建一个
NSMutableArray
。在类别m中:

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

这样,您只需要使用子类别,因为它已经存在,因为它将根据需要创建。这样,您就不会再有漏洞了。

在下一行中,
category.subCategories==[[NSMutableArray alloc]init],您有一个双等号,并检查它是否为真。所以子类别在这里仍然为零,这就是为什么
count
为0

使用
category.subCategories=[[NSMutableArray alloc]init]取而代之

就我个人而言,我会使用一个自定义getter惰性地创建一个
NSMutableArray
。在类别m中:

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

这样,您只需要使用子类别,因为它已经存在,因为它将根据需要创建。这样,您也就不再有泄漏。

您的代码将泄漏内存-您需要释放分配给子类别的数组和子类别本身,以增加它们的保留计数。谢谢,但这只是一个原型,实际代码将从SQLite读取数据,因为数据将来自Web服务,而且会有很多数据,我不想总是将其存储在内存中您的代码将泄漏内存-您需要释放分配给子类别的数组和子类别本身,以增加它们的保留计数。谢谢,但这只是一个原型,实际代码将从SQLite读取数据,因为数据将来自一个Web服务,并且会有很多数据,对于这个问题,我不想总是记忆犹新,但我个人不同意自定义getter。初始化器用于初始化代码。不需要把它扔到地球的四个角落,在上面创建更多的额外代码。我个人认为这更容易。懒惰创造是Cocoa的设计模式之一。它还可以节省内存(这个论点在这种情况下是不相关的,但有时可能是一个巨大的胜利)。这是我个人的爱好,在init方法中创建子类别也是正确的。然而,将其视为“我现在需要它,为什么我不创建它”比“我以后可能需要它,创建它”更容易(至少对我而言)。我不认为懒惰创建真的是一种可可设计模式。然而,在iPHone上,这可能是一个很好的做法,因为你没有那么多的内存。在较小的设备上,对内存使用保持保守总是一个好主意。关于这个问题,我是对的,但我个人不同意自定义getter。初始化器用于初始化代码。不需要把它扔到地球的四个角落,在上面创建更多的额外代码。我个人认为这更容易。懒惰创造是Cocoa的设计模式之一。它还可以节省内存(这个论点在这种情况下是不相关的,但有时可能是一个巨大的胜利)。这是我个人的爱好,在init方法中创建子类别也是正确的。然而,将其视为“我现在需要它,为什么我不创建它”比“我以后可能需要它,创建它”更容易(至少对我而言)。我不认为懒惰创建真的是一种可可设计模式。然而,在iPHone上,这可能是一个很好的做法,因为你没有那么多的内存。在较小的设备上,对内存使用保持保守始终是一个好主意。