0

我尝试初始化数组:

在 .h 文件中

    @property (nonatomic, retain) NSArray *accounts;

在 .m 文件中:

    @synthesize accounts;

    - (void)viewDidLoad
    {
       [super viewDidLoad];
       NSArray *arrList = [acAccountStore accountsWithAccountType:accountType];  
       // This returns array
       self.accounts = [NSArray arrayWithArray:arrList]; // I tried debug after 
       // this and it gives me data in debugger.  
       // Note array List have 3 data in it.   
       }

现在点击按钮我调用一个方法:

- (IBAction) ButtonClicked :(id) sender {
      NSLog(@" data : %@",[self.accounts objectAtIndex:0]); // Breaks at this point. 
      //  When i tried with debug it gives me (no Objective-C description available)
}

数组的初始化是否正确或者如果代码不正确,请告诉我。

主要问题是当我在 viewDidLoad 中进行调试时,self.accounts 会显示正确的值。但是在点击事件之后它是空的并抛出 EXEC_BAD_ACCESS 错误。

提前感谢您的帮助

4

2 回答 2

0

更新:

也为您的帐户商店创建一个属性。我最近遇到了这个确切的问题,并且修复了它。

@property (nonatomic, strong) ACAccountStore *accountStore;

原始答案

因为您正在使用ARC,所以您需要将您的属性声明从

@property (nonatomic, retain) NSArray *accounts;

至:

@property (nonatomic, strong) NSArray *accounts;

使用最新的 LLVM 编译器,您也不需要综合属性。所以你可以删除@synthesize accounts.

您也应该始终使用防御性编码,因此在您的- buttonClicked:方法中,您应该:

- (IBAction)buttonClicked:(id)sender {
    if (self.accounts) {
          NSLog(@"data: %@", [self.accounts objectAtIndex:0]);
    }
}

这确保了指向数组的指针是有效的。

您还可以通过执行以下操作检查以确保数组中的项目存在,然后再尝试读取它:

- (IBAction)buttonClicked:(id)sender {
    if (self.accounts.count > 0)
          NSLog(@"data: %@", [self.accounts objectAtIndex:0]);
    }
 }
于 2012-12-23T02:49:38.287 回答
0

嗯看起来不错。那么有几个问题:

您在哪里调用self.accounts = [NSArray arrayWithArray:arrList]; 我假设在按下按钮之前正在设置数组?

arc 没有真正的理由应该清除变量。你对它设置了强引用还是弱引用?如果你在self.变量上使用,你应该有:

@property (nonatomic, strong) NSArray *accounts;

或类似于 .h 文件中的内容,然后

@synthesize accounts;

在 .m 文件中。

如果你有weakstrong那么 ARC 可能会清除内存,但它仍然不应该。

于 2012-12-23T00:41:35.770 回答