【问题标题】:How initialize NSArray as property objective-c如何将 NSArray 初始化为属性objective-c
【发布时间】:2014-04-03 13:53:57
【问题描述】:

我想在整个类 (self.array) 中使用类似 NSArray 的属性,但我不知道怎么做。现在我的 LoginVC 中有这段代码:

LoginVC.h:

#import <UIKit/UIKit.h>

@interface LoginVC : UIViewController

@property (strong, nonatomic) IBOutlet UITextField *usernameTextField;
@property (strong, nonatomic) IBOutlet UITextField *passwordTextField;
@property (strong, nonatomic) IBOutlet UIScrollView *loginButton;
@property (nonatomic, strong) NSArray *allUsers;

@end

LoginVC.m:

- (void)viewDidLoad
{
    if (debug == 1) {
        NSLog(@"Running %@ '%@'", self.class, NSStringFromSelector(_cmd));
    }
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    UserController *userController = [[UserController alloc]init];

    [userController getUsers];

    self.allUsers = [NSArray new];

    self.allUsers = [userController getUsers];

}

getUser 方法返回一个 NSArray,但是这个解决方案不起作用。 llbd 报错:*Thread 1: EXC_BAD_ACCESS (code=2, address=0x38)* 我认为问题在于初始化数组和赋值。

getUsers 声明:

-(NSArray *)getUsers{
    CoreDataHelper *cdh = [(AppDelegate *)[[UIApplication sharedApplication]delegate] cdh];

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"User"];

    NSArray *users = [cdh.context executeFetchRequest:request error:nil];

    return users;

}

“getUsers”方法工作正常。

这是错误的屏幕。它的强度,因为 self.allUsers 包含一个用户名为“admin”的对象,而且它绝对正确。

https://www.dropbox.com/s/ui5rtq9ov0p2xx9/Screenshot%202014-03-02%2019.24.53.png

我认为问题出在数组中,因为当我删除分配给数组的代码时。错误消失。

【问题讨论】:

  • 发布getUsers 方法,或至少发布相关部分。
  • Objective-C 和 iOS 编程的任何介绍都涵盖了这类内容。
  • 嘿,我推荐阅读这个:loufranco.com/blog/understanding-exc_bad_access
  • 你的财产声明没问题。
  • self.allUsers = [NSArray new]; 毫无意义,因为您会立即用另一个数组覆盖该数组。但这不会导致这个问题 - 你可以发布你的整个堆栈跟踪吗?为什么你认为这个错误与这个数组有关?

标签: ios initialization nsarray exc-bad-access lldb


【解决方案1】:

这里的关键是你的 UserController 对象。您的日志输出显示failed to call designated initialiser for NSManageObject Subclass UserController,这让我认为它是一个 NSManagedObject。

NSManagedObjects 是自动释放的,在您的情况下,它不会被 NSManagedObjectContext 保留,这会导致 EXC_BAD_ACCESS。尝试在启用僵尸的情况下运行您的应用,它应该会显示正在释放的对象以及导致错误的原因。

编辑:可能是我错了,但也可能是您的 CoreDataHelper 的初始化方式是相关的。请参阅此答案,了解如何在测试应用时启用 Zombies:How to enable NSZombie in Xcode?

【讨论】:

  • 谢谢。我启用了僵尸模式(产品->编辑方案->诊断->单击启用僵尸对象),但没有任何改变(没有新错误)。但我解决了如下问题:从类User继承的类UserController对象和从类NSManaged对象继承的类User。我改变了它,现在类 UserController 继承自 NSObject 并且它可以工作......但我不知道它在概念上是否正确。
  • 看看 Paul Goracke 关于 Core Data 的幻灯片:xcoders.s3.amazonaws.com/… 恕我直言,他对代码的组织方式很了解。从概念上讲,除非对象应该存储在上下文中,否则它应该继承自 NSObject,而不是 NSManagedObject。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
相关资源
最近更新 更多