【问题标题】:iOS 5 sdk issue with mutable arrays可变数组的 iOS 5 sdk 问题
【发布时间】:2012-01-08 19:47:49
【问题描述】:

您好,我在 iOS 4.3.3 上创建了一个应用程序,然后下载了 Xcode 4.2.1 和 iOS sdk 5。它是一个基于导航的应用程序,它有一个用于 tableview 的可变数组,但它不会为数组,所以我在 viewdidload 的数组中添加了一个对象,但它不起作用!所以我将 NSlog 添加到我的数组中的对象中,它显示为空!我该怎么办?

这里是viewdidload:

    - (void)viewDidLoad
    {
    [super viewDidLoad];
    self.soldc = [NSMutableArray arrayWithCapacity:0];
    self.color = [NSMutableArray arrayWithCapacity:0];
    appdelegate = (yard_sale_managerAppDelegate *)[[UIApplication sharedApplication]          delegate];
    appdelegate.object = self;
    NSMutableArray *loadi = [[NSMutableArray alloc]initWithCapacity:0];
    self.items = loadi;
    self.sold = [NSMutableArray arrayWithCapacity:0];
    self.prices = [NSMutableArray arrayWithCapacity:0];

    alert = [[UIAlertView alloc] initWithTitle:@"Add product" message:@"Enter your   product name and price." delegate:self cancelButtonTitle:@"Add" otherButtonTitles:@"Cancel",   nil];
    [alert addTextFieldWithValue:@"" label:@"name"];
    [alert addTextFieldWithValue:@"" label:@"price"];
    add = [alert textFieldAtIndex:0];
    add.keyboardType = UIKeyboardTypeAlphabet;
    add.keyboardAppearance = UIKeyboardAppearanceAlert;
    add.autocapitalizationType = UITextAutocapitalizationTypeWords;
    add.autocorrectionType = UITextAutocorrectionTypeNo;
    add2 = [alert textFieldAtIndex:1];
    add2.keyboardType = UIKeyboardTypeNumberPad;
    add2.keyboardAppearance = UIKeyboardAppearanceAlert;
    add2.autocapitalizationType = UITextAutocapitalizationTypeWords;
    add2.autocorrectionType = UITextAutocorrectionTypeNo;
    NSLog(@"%i", [color count]);
    alert.tag=1;
    self.resa = [[UIAlertView alloc] initWithTitle:@"Sale results" message:@"temple" delegate:self cancelButtonTitle:@"Close" otherButtonTitles: nil];
    self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];
    self.prices = [NSMutableArray arrayWithContentsOfFile:[self pricesp]];
    self.sold = [NSMutableArray arrayWithContentsOfFile:[self soldp]];
    self.soldc = [NSMutableArray arrayWithContentsOfFile:[self soldcp]];
    self.color = [NSMutableArray arrayWithContentsOfFile:[self colorsp]];
    if ([self.soldc count]==0) {

    }
    //self.soldc = [NSMutableArray arrayWithContentsOfFile:[self soldcp]];
    self.color = [NSMutableArray arrayWithContentsOfFile:[self colorsp]];
    [loadi release];
    self.resa.tag = 2;
    [self.items addObject:@"chair"];   
    [self.prices addObject:@"30"];
    [self.color addObject:@"0"];
    NSLog(@"%@",self.items);
}

如果您需要更多信息,请告诉我! 这是日志:

2012-01-08 21:31:13.409 yard sale manager[1152:f803] 0
2012-01-08 21:31:13.411 yard sale manager[1152:f803] (null)

编辑:阅读这很重要!!!! 很多人没有注意到这段代码: [self.items addObject:@"chair"];
[self.prices addObject:@"30"]; [self.color addObject:@"0"]; NSLog(@"%@",self.items);

【问题讨论】:

  • 你显然不知道你在做什么。更新viewDidLoad 尾部的字段有什么好处?你知道arrayWithContentsOfFile可以返回nil吗?

标签: iphone objective-c ios ios5 xcode4.2


【解决方案1】:

这一行

self.color = [NSMutableArray arrayWithCapacity:0];

实例化并分配一个空数组,然后您不向其中添加任何内容,因此 0 计数。

然后这一行

self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];

可能是原因。 [self itemsp] 是否返回指向可解析为 NSArray 的文件的有效文件路径。

这段代码还有很多其他问题。


更新

这一行

self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];

必须返回nil

在它后面直接添加这一行来确认

NSLog(@"%@", self.items);

我怎样才能做出这个假设

我做出这个假设的原因是因为你得到了(null)。当您在 nil 上调用 addObject: 时,您将返回 nil,这是一个无操作。从这个sn-p可以看出

NSMutableArray *myArray = nil;

[myArray addObject:@"Test"];

NSLog(@"%@", myArray);

// => 2012-01-08 20:54:04.708 Untitled[4199:707] (null)

仅仅因为myArray 拥有一个指向NSMutableArray 的指针,并不意味着你确实拥有一个。

因此,您最后一次分配给self.items 的时间是:

self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];

这意味着[NSMutableArray arrayWithContentsOfFile:[self itemsp]] 正在返回nil

【讨论】:

  • 我告诉过你它只是代码的一部分,路径是:-(NSString*)itemsp{ NSString *path = [NSString stringWithFormat:@"%@%@", [[NSBundle mainBundle ] resourcePath],@"items.plist"];我稍后会向颜色添加东西,但它不会添加......它不会添加我的问题是数组有什么问题如果您需要更多信息,请告诉我您需要什么,我会发布它
  • 这并不能回答这是否真的返回了一个有效的路径,以及文件是否可以解析成NSArray
  • 捆绑包是只读的,因此不会将文件写入磁盘。
  • 这个想法是您在此站点上提出问题以寻求帮助。您似乎对解决问题不感兴趣,因为您只是忽略了建议。最后分配给self.items的是[NSMutableArray arrayWithContentsOfFile:[self itemsp]];,因此最有可能为nil的方法是文件不存在或无法解析。
  • @user1014334 -- 您不能将对象添加到不存在的数组中! PYHOOYA!
【解决方案2】:

鉴于NSLog(@"%@",self.items); 打印(null),因此永远不会创建self.items NSMutableArray。唯一可能发生的方法是如果

self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];

返回 nil,即不读取任何内容,可能是因为路径上没有任何内容。

NSLog self.items 在声明之后:

self.items = [NSMutableArray arrayWithContentsOfFile:[self itemsp]];

如果您尝试写入不起作用的应用程序包,则需要编写一个目录,例如沙盒文档目录。

【讨论】:

  • 该路径存在我知道它,因为当我将模拟器从 5 更改为 4.3 时,它会输入一些我没有添加到我保存到该路径中的文件中的代码中的对象。并且可以说路径不正确,而不是该行不起作用的原因: [self.items addObject:@"chair"]; NSlog 正上方的哪个不会添加任何对象?
  • 您从我建议在设备上的 NSLog 中得到了什么?基本上你是在争论你的代码是正确的,同时它不工作,两个论点都不正确。
  • 我仍然得到空值,我只是说代码与 ios5 不兼容,我不确定。还有更多想法吗?
  • @user1014334 您的代码通常是错误的并且非常乐观。阅读并学习一些关于防御性编程的知识。它在 iOS4 上运行而在 iOS5 上失败的事实并不一定意味着您发现 iOS5 不兼容。这也可能意味着你以前很幸运,现在你面临一个事实:糟糕的代码。
  • 听我说我是初学者我知道我的代码并不出色而且很棒我会尝试你的建议但不是现在我不在家...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多