0

我对Objective C很陌生。

我有一个类 PassageViewController。这是.h文件:

#import <UIKit/UIKit.h>

@interface PassagesViewController : UIViewController {
    UIButton *showPassagesButton;
    UIButton *addButton;

    UIView *passagesPanel;
}

@property (nonatomic, retain) NSMutableArray *titlesArray;
@property (nonatomic, retain) NSMutableArray *thePassages;

@end

在 .m 文件中,我有:

@implementation PassagesViewController

@synthesize thePassages;

- (id) init {
    if (self = [super init]) {

        self.title = @"Passages";

    }
    return self;
}


- (void)viewDidLoad
{
    [super viewDidLoad];
 // Do any additional setup after loading the view.

    thePassages = [NSMutableArray arrayWithCapacity:0];

    [self initTestPassages];
    NSLog("%@", [thePassages description]);

    ...
    (Code to lay out the buttons etc on screen, as I'm not using a xib file)
    ...
}

initTestPassages 方法只是用一堆不同的对象(使用方法addObject)填充 thePassages。这个方法不打算在完成的应用程序中使用,我只是在玩 thePassages 以确保我完全理解它是如何工作的。(我不知道。) viewDidLoad 方法中的 NSLog 行告诉我,thePassages 包含我希望它包含的对象,至少在那时。

问题是,当我尝试从上述方法之外的任何地方访问 _thePassages 时,应用程序崩溃并显示 EXC_BAD_ACCESS 消息。例如,我创建了一个包含单行的方法int i = [thePassages count]并调用该方法(例如,通过将其分配给屏幕上的一个 UIButtons 崩溃并给出错误。

我看过类似的问题,据我所知,问题与内存管理有关,但这确实不是我非常了解的主题,我不知道从哪里开始。我究竟做错了什么?

4

1 回答 1

4

改变

thePassages = [NSMutableArray arrayWithCapacity:0];

self.thePassages = [NSMutableArray arrayWithCapacity:0];

为什么?

原行是直接设置值,没有经过生成的setter方法。setter 方法将为您保留对象,而直接设置它时,您需要自己做。因此,您已将一个自动释放的对象分配给一个变量,因此虽然它当前在 的范围内有效viewDidLoad:,但随后当实例被释放和解除分配时,对象引用将变得无效。

引导说明:您是否考虑过切换到 ARC?它将消除此类问题。

于 2013-02-05T17:32:56.670 回答