我有一个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时才会出现这种情况。
感谢任何答案!
答案 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代替。