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