【问题标题】:Issue with NSMutableArray visibility / retainNSMutableArray 可见性/保留问题
【发布时间】:2011-10-30 00:27:20
【问题描述】:

好吧,我对 NSMutableArray 类有点陌生,我认为我遗漏了一些明显的东西。我有一个对象将一个 NSMutable 数组传递给我的窗口控制器,就像在 my.m 中一样:

summaryWindow   = [[SummaryWindowController alloc] init];
[summaryWindow setGlobalStatusArray:globalStatusArray];

我在 summaryWindow 对象中有接收器方法:

-(void)setGlobalStatusArray:(NSMutableArray *)myArray
{

    if ([myArray count] >0) {
        if (globalStatusArray) {
            [globalStatusArray release];
        }
        globalStatusArray = [[NSMutableArray alloc] initWithArray:myArray];

        NSLog(@"Summary Window Init with new array: %@",globalStatusArray);

我看到 NSLog 没问题,在同一个对象(summaryWindow)中我有以下方法:

- (NSMutableArray *)getGlobalStatusArray
{

    return globalStatusArray;
}

现在我在 .h 文件中将 globalStatusArray 声明为

NSMutableArray   *globalStatusArray;

所以不应该因为我使用的是:initWithArray 而保留它吗?

当我尝试在另一个 IBAction 方法中访问此值时:

- (IBAction)refreshButtonClicked:(id)sender
{
    NSLog(@"The user has clicked the update button");
    [ aBuffer addObjectsFromArray: globalStatusArray];
    NSLog(@"Buffer is currently:%@",aBuffer);
    [tableView reloadData];
}

NSMutable 数组为空

2011-08-18 10:40:35.599 App Name[65677:1307] The user has clicked the update button
2011-08-18 10:40:35.600 App Name[65677:1307] Buffer is currently:(
)

我尝试使用自己的方法来获取值,即 [self getGlobalStatusArray] 到,但我错过了一些巨大的东西。仅供参考 aBuffer 也在我的 .h 中声明,

【问题讨论】:

  • 而不是nil,看起来您的数组是空的。如果是nil,它将记录(null)

标签: objective-c cocoa nsmutablearray retaincount


【解决方案1】:

这段代码没有做任何有用的事情:

if ([myArray count] >0) {
    if (globalStatusArray) {
        [globalStatusArray release];
    }
    globalStatusArray = [[NSMutableArray alloc] initWithArray:myArray];

如果旧数组的计数为零,则它正在泄漏实际的数组对象。如果计数不为零,则它正在正确释放它。只需发布即可,无需费心计算。

你确定 myArray 中确实有东西吗?

【讨论】:

  • 那是代码审查,是的,你的权利我不需要真正做那个检查
【解决方案2】:

正如 albertamg 所指出的,这看起来像是一个空数组而不是 nil,并且在正常情况下,释放的对象不会神奇地变成 nil。

这有两种不同物体的强烈气味。尝试在您的方法中记录 self 并查看一个实例是否正在获取数组,而另一个实例是否正在与 UI 交互。

【讨论】:

  • 是的,它看起来可能是两个不同的对象,一个在 xib 中,一个由另一个对象创建。现在我需要弄清楚如何将数组传递给那个 UI 控制器。
  • 这是我对同一主题的后续问题stackoverflow.com/questions/7112903/…
  • 我想知道为什么我会在控制台中收到重复的 NSLog,现在这很有意义,我这里有两个对象在起作用。
  • 我不确定我是如何解决这个问题的,在我添加了@property (nonatomic, retain) IBOutlet NSWindow *window;我不再看到重复。模型本身仍有问题
猜你喜欢
  • 1970-01-01
  • 2010-11-02
  • 2012-06-15
  • 1970-01-01
  • 2020-12-10
  • 1970-01-01
  • 1970-01-01
  • 2021-05-27
  • 1970-01-01
相关资源
最近更新 更多