Iphone NSMutableArray计数不断变化

Iphone NSMutableArray计数不断变化,iphone,objective-c,class,nsmutablearray,Iphone,Objective C,Class,Nsmutablearray,我有太多的代码需要在这里引用,但在我的应用程序委托中,我有一个NSMutableArray。然后在另一个类中,它为NSMutableArray创建了一个新条目,但当传递回另一个类时,该类将使用该条目在屏幕上显示某些内容,它不会显示任何内容。将NSMUTABLEARRY计数的NSLog放在类的末尾,创建它时会显示数字1,然后将相同的NSLog代码放在类的开头,该类将使用该代码,返回0 你知道为什么吗 编辑:好的,我将尝试包含所有相关代码 app delegate.h: @interface pal

我有太多的代码需要在这里引用,但在我的应用程序委托中,我有一个NSMutableArray。然后在另一个类中,它为NSMutableArray创建了一个新条目,但当传递回另一个类时,该类将使用该条目在屏幕上显示某些内容,它不会显示任何内容。将NSMUTABLEARRY计数的NSLog放在类的末尾,创建它时会显示数字1,然后将相同的NSLog代码放在类的开头,该类将使用该代码,返回0

你知道为什么吗

编辑:好的,我将尝试包含所有相关代码

app delegate.h:

@interface palettesAppDelegate : NSObject <UIApplicationDelegate> {
 NSMutableArray *colourPalettesContainer;

}
@property (assign, readwrite) NSMutableArray *colourPalettesContainer;
@end
Homeview.h:

#import <UIKit/UIKit.h>
#import "HandlingPalettes.h"

@interface HomeView : UIViewController {

    HandlingPalettes *handlingPalettes;

}


@end

您的主可变数组位于应用程序代理中。那么,看看如果在每个要访问数组的方法中,您都有设置应用程序委托关系的行,会发生什么

    palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate];
现在,当您调用数据中心对象时,您将引用应用程序委托,您的程序将找到数组

您还可能会发现,在要引用应用程序委托的每个对象中,都需要有一个
#import“PaletteAppDelegate.h”


注意,从体系结构的角度来看,仅仅添加应用程序委托代码并不一定是解决此问题的正确方法。但如果成功了,你至少知道你原来问题的答案

您的主可变数组位于应用程序代理中。那么,看看如果在每个要访问数组的方法中,您都有设置应用程序委托关系的行,会发生什么

    palettesAppDelegate *dataCenter = (palettesAppDelegate *)[[UIApplication sharedApplication] delegate];
现在,当您调用数据中心对象时,您将引用应用程序委托,您的程序将找到数组

您还可能会发现,在要引用应用程序委托的每个对象中,都需要有一个
#import“PaletteAppDelegate.h”


注意,从体系结构的角度来看,仅仅添加应用程序委托代码并不一定是解决此问题的正确方法。但如果成功了,你至少知道你原来问题的答案

我倾向于放弃newPalette方法,而是在应用程序委托中为ColorPalettes容器创建一个getter方法。 即:

appdelegate.h

@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> {
   NSMutableArray *colourPalettesContainer;

} 
@property (non-atomic, retain) NSMutableArray *colourPalettesContainer;
@end

@implementation palettesAppDelegate
然后,您应该能够通过调用

[appDelegate.colourPalettesContainer addObject:object];

我倾向于放弃newPalette方法,而是在应用程序委托中为ColorPalettes容器创建一个getter方法。 即:

appdelegate.h

@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> {
   NSMutableArray *colourPalettesContainer;

} 
@property (non-atomic, retain) NSMutableArray *colourPalettesContainer;
@end

@implementation palettesAppDelegate
然后,您应该能够通过调用

[appDelegate.colourPalettesContainer addObject:object];

我怀疑问题最终与
colorplatetscontainer
成员的内存管理混乱有关。您可以在app delegate的
dealloc
方法中释放它,但该类从未保留它!如果你遵循苹果的做法,那就更干净了:你的类应该只发布它们拥有的对象(也就是说,它们自己先前保留的对象)。例如,您可以通过声明数组的属性
retain

@property (retain) NSMutableArray *colourPalettesContainer;
(为了防止数组泄漏,您还需要在
newPalette
方法中释放或自动释放它。保留和释放应始终成对进行。)

但更好的是,为什么不直接在app委托的init方法或其访问器中创建数组(如果出于某种原因,您只想在首次使用时继续创建它)?除非您希望一次替换所有选项板,否则没有理由让阵列从应用程序代理外部指定给

@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> {
@private
    NSMutableArray *colourPalettesContainer;
}
@property (readonly) NSMutableArray *colourPalettesContainer;
@end

@implementation PalettesAppDelegate

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

- (void)dealloc {
    [colourPalettesContainer release];
    [super dealloc];
}
@end
@接口选项板AppDelegate:NSObject{
@私人的
NSMutableArray*调色板容器;
}
@属性(只读)NSMutableArray*颜色调色板容器;
@结束
@实现选项板AppDelegate
-(NSMutableArray*)调色板容器{
如果(颜色调色板容器==nil){
ColorPalettesContainer=[[NSMutableArray alloc]init];
返回调色板容器;
}
-(无效)解除锁定{
[调色板容器释放];
[super dealoc];
}
@结束
为了使设计更简洁,请将
colorplatetscontainer
属性的类型更改为
NSArray*
,并向应用程序委托添加
-addpalete:
方法。(公开类内的可变数组很少是一个好主意。)然后,您只需在
处理调色板
中删除
-newPalette
。(如果您想在
处理调色板
中使用所有调色板处理方法,只需将数组移动到那里。如果您需要从应用程序中的随机位置访问调色板,则只需在应用程序委托中保留对
处理调色板
对象的引用即可。)

一旦清理了对象所有权混乱,计数不匹配将“通过魔法”自行解决,或者原因可能会变得更加明显。在后一种情况下,请检查
HomeView
数据中心
是否与
HandlingPalettes
中的对象实际相同。(您忽略了
HomeView
如何获取其引用-您确定不是意外地创建了另一个应用程序委托实例?)


(顺便说一句,您可能想在
newPalette
中使用
-addObjects:
,而不是
-addObject:
。还要注意,所有类名都应该大写,没有例外:即始终使用
PalettesAppDelegate
,永远不要使用
PalettesAppDelegate
。如果出于某种原因,Xcode的项目模板像t一样创建它hat,只需重命名该类。小写类名很容易与变量名混淆。此外,一般来说,尝试找到更好的名称:例如,我会使用
PalettesViewController
,而不是
HandlingPalettes
(以反映它是UIViewController的子类这一事实);而不是
数据中心
,我宁愿选择
appDelegate

我怀疑问题最终与
ColorPalettesContainer
成员的内存管理混乱有关
@property (retain) NSMutableArray *colourPalettesContainer;
@interface PalettesAppDelegate : NSObject <UIApplicationDelegate> {
@private
    NSMutableArray *colourPalettesContainer;
}
@property (readonly) NSMutableArray *colourPalettesContainer;
@end

@implementation PalettesAppDelegate

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

- (void)dealloc {
    [colourPalettesContainer release];
    [super dealloc];
}
@end