在具有子类UITableViewCell的UITableViewController中发生EXC_BAD_ACCESS错误

时间:2012-05-09 18:04:24

标签: iphone ios uitableview subclass exc-bad-access

我有一个UITableViewController来管理使用子类原型单元格创建的表视图。最相关的代码如下:

MyCell.h

#import <UIKit/UIKit.h>
@interface ScrollViewTableCellInShorTrip : UITableViewCell
@end

MyCell.m

#import "MyCell.h"
@implementation SMyCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
if (self) {
    // Initialization code
}
return self;
}

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event 
{   
NSLog(@"touch cell");
[super touchesEnded: touches withEvent: event];

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
[super setSelected:selected animated:animated];
}
}
@end

TableViewController.h

#import <UIKit/UIKit.h>

@interface TableViewController : UITableViewController{
}
@property (nonatomic, retain) NSArray *arr;
@end

TableViewController.m

#import "TableViewController.h"
#import "MyCell.h"
@implementation ATripTableViewController
@synthesize arr;

- (void)viewDidLoad
{
[super viewDidLoad];
self.arr = [NSArray arrayWithObjects:@"one", @"two", @"three", nil];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
CellIdentifier = @"myCell";
MyCell *myCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

return myCell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
  [self performSegueWithIdentifier:@"detailView"sender:self];     
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{    
if ([[segue identifier] isEqualToString:@"detailView"]){
   NSLog(@"arr acount is %d", self.arr.count);//program received signal: "EXC_BAD_ACCESS".
}   
}

在prepareForSegue:sender:方法中调用“NSLog(@”arr acount is%d“,self.arr.count)”时出现EXC_BAD_ACCESS错误消息。显然,“arr”属性现在是免费的。只有当我使用子类UITableViewCell时才会出现这种情况。

感谢任何答案!

2 个答案:

答案 0 :(得分:3)

NSLog(@"arr acount is %d", self.arr.count);替换为NSLog(@"arr acount is %d",arr.count);

自我的定义:
 self是一个特殊变量,它是一个指向接收调用当前正在执行的方法(!)的消息的对象的指针。换句话说,它是消息的接收者。

当你应该调用self.object而不是直接在对象中调用对象时。

self.object = obj;
object = obj;

这两个调用之间的区别在于对self.object的调用将使用@synthesize指令生成的访问器。直接调用对象将绕过这些访问器方法并直接修改实例变量

答案 1 :(得分:2)

count是一个原始(整数),而不是一个对象,因为你指的是它与%@一样。使用%i代替。