【问题标题】:Having trouble adding objects to NSMutableArray in Objective C在 Objective C 中将对象添加到 NSMutableArray 时遇到问题
【发布时间】:2023-03-12 19:31:01
【问题描述】:

我正在使用 iPhone SDK,但在做一些简单的事情时遇到了问题。我正在尝试将 NSNumber 对象添加到 NSMutableArray 实例变量。我尝试将 NSNumber card 添加到 NSMutableArray viewedCardsArray,但是没有中断,它不会被添加到数组中。这是代码。


/////////////////////////////////////////////////////
// Inside the header file Class.h
@interface MyViewController : UIViewController {
   NSMutableArray *viewedCardsArray;
   //snip ...
}
@property (nonatomic, retain) NSMutableArray *viewedCardsArray;
@end

/////////////////////////////////////////////////////
// Inside the methods file Class.m
#import "StudyViewController.h"

@implementation StudyViewController
@synthesize viewedCardsArray
  //snip ...

- (IBAction)doShowCard {
   //snip ...
   NSNumber *cardIdObject = [[NSNumber alloc] initWithInt:(int)[self.currentCard cardId]];
   [viewedCardsArray addObject: cardIdObject];
   [cardIdObject release];
}

所以这段代码执行了,并且似乎没有泄漏(根据 Leaks 性能工具)。但是,在单步执行代码时,CardIdObject 不会出现在 viewedCardsArray 中。

通过 SO,我知道这些基本问题对于 ObjC 新手(比如我)来说很常见,所以提前道歉!

【问题讨论】:

    标签: objective-c iphone cocoa cocoa-touch


    【解决方案1】:

    你初始化你的viewedCardsArray了吗?如果不需要,您需要在某个地方 - 这通常在您的班级的 init 方法中完成:

    - (id)init
    {
        self = [super init];
        if(self) {
            viewedCardsArray = [[NSMutableArray alloc] init];
        }
        return self;
    }
    

    然后在dealloc方法中释放:

    - (void)dealloc
    {
        [viewedCardsArray release];
        [super dealloc];
    }
    

    【讨论】:

    • 别忘了使用[super init]的结果。它可以返回 nil 或不同的对象。永远不要假设它返回了你以前的自我,因为当它没有返回时,它会释放它,并且你对那个现在死去的对象所做的任何进一步的初始化都可能会导致崩溃。最简单的方法是 if ((self = [super init])) { /*initialize here*/ } return self; (取决于你自己的风格品味——例如,如果你愿意,你可以在条件之前有赋值)。
    • 对不起,我的意思是那一行是 self = [super init];但是是的,这是一个更好的方法
    • 感谢大家的帮助。我现在很欣赏类声明和实例化变量之间的区别!
    • 我的myArray = [[NSArray alloc] init]; 方法中有init。但是子类没有调用init。它正在调用initWithStyle。所以我的数组初始化没有发生 8-)
    • 这也是我的错误。我假设将它放在标题中并对其进行合成初始化了对象。显然不是!
    【解决方案2】:

    Perspx 概述了一种初始化数组的方法。不过,你也可以使用 NSArray 提供的类方法:

    self. viewedCardsArray = [NSMutableArray array];
    

    这可以进入 init 或其他地方。

    注意:该对象将被自动释放。

    【讨论】:

    • 问题在于,当您在 -init 中设置自己的属性时,您会将消息(特别是访问器消息)发送到未完全初始化的对象(self)。在-dealloc 中反过来也是如此。如果您实现一个自定义访问器,假设其他一些 ivar 已被初始化并且其中的对象(如果有)仍然有效,这可能会成为一个问题。
    • 如果您使用合成属性,这是一种非常有效的处理方式。例如,有 Apple 代码可以执行此操作,也有相反的操作:在 -dealloc 方法中使用 self.someProperty = nil。
    猜你喜欢
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    相关资源
    最近更新 更多