Objective c 如何通过NSMutableArray在UITableView上显示数据?

Objective c 如何通过NSMutableArray在UITableView上显示数据?,objective-c,uitableview,nsmutablearray,Objective C,Uitableview,Nsmutablearray,我尝试使用NSMutableArray对象作为数据容器来存储数据 @property (retain, nonatomic) NSMutableArray* allTweets; 我从网络中获取JSON并将其解析为allTweets。但是,我无法使用重新加载数据 [self.tableView重载数据]我在main.m 我尝试在属性中使用strong。它又崩溃了。当我使用弱时,不会再发生崩溃。但是所有的推特总是零 - (void)viewDidLoad { [s

我尝试使用
NSMutableArray
对象作为数据容器来存储数据

@property (retain, nonatomic) NSMutableArray* allTweets;
我从网络中获取JSON并将其解析为
allTweets
。但是,我无法使用重新加载数据
[self.tableView重载数据]我在
main.m

我尝试在属性中使用
strong
。它又崩溃了。当我使用
时,不会再发生崩溃。但是所有的推特总是零

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //* other codes *//
        self.allTweets = [[NSMutableArray alloc]initWithCapacity:50];
        [self getTimeline:nil];
    }

-(void) parseTweetJSON:(NSData*) responseData
{
    NSMutableArray* tempTweets = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
   //convert each element in array into nsdictionary
    for (NSDictionary *aTweet in tempTweets)
    {
        NSLog(@"%@ (by @%@)", [aTweet objectForKey:@"text"], [[aTweet objectForKey:@"user"] objectForKey:@"screen_name"]);
        Tweet* theTweet = [[Tweet alloc]init];    

        theTweet.text = [aTweet valueForKey:@"text"];
        theTweet.screenName = [[aTweet valueForKey:@"user"] valueForKey:@"screen_name"];
        theTweet.createAt = [aTweet valueForKey:@"create_at"];

        NSLog(@"class is %@", [[aTweet valueForKey:@"text"]class]);
        [allTweets addObject:theTweet];
    }

    if([allTweets count]>0)
    {
        [self.tableView reloadData];
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
        cell.textLabel.numberOfLines = 0;
        cell.detailTextLabel.numberOfLines = 0;
    }

    NSInteger row = [indexPath row];
    Tweet* aTweet = [[Tweet alloc]init];
    aTweet = [allTweets objectAtIndex:row];

    cell.textLabel.text = aTweet.screenName;
    cell.detailTextLabel.text = aTweet.text;

    return cell;
}
我应该为
NSMutableArray
使用什么属性类型,保留、复制、强。 顺便说一句,我使用Xcode 4.2

2011-11-28 02:54:23.968 SparkTweet[2039:10703]类是uu NSCFString
2011-11-28 02:54:23.969 SparkTweet[2039:10703]-[Tweet
isEqualToString::发送到实例0x6e46c50的选择器无法识别
2011-11-28 02:54:23.970 SparkTweet[2039:10703]*终止应用程序到期
未捕获异常“NSInvalidArgumentException”,原因:'-[Tweet
isEqualToString::发送到实例0x6e46c50'的无法识别的选择器
*
第一次抛出调用堆栈:(0x14c1052 0x189dd0a 0x14c2ced 0x1427f00 0x1427ce2 0x1b168f 0x4edf 0x24e548 0x250722 0x1007c7 0x1002c1 0x4371
0x14c2e72 0x98b9ef 0x149597f 0x13f8c39 0x13f8454 0x13f7db4 0x13f7ccb
0x1F879 0x1f8f93e 0x73a9b 0x2bf8 0x2b55 0x1)终止调用
抛出异常

在重新加载数据时引发此异常。NSLog最近发布了20条推文

这是我的tweet类声明

#import <Foundation/Foundation.h>

@interface Tweet : NSObject
{
    NSString* name;
    NSString* screenName;
    NSString* text;
    NSString* createAt;
}

@property (copy,nonatomic) NSString* name;
@property (copy,nonatomic) NSString* screenName;
@property (copy,nonatomic) NSString* text;
@property (copy,nonatomic) NSString* createAt;

@end
#导入
@接口Tweet:NSObject
{
NSString*名称;
NSString*屏幕名称;
NSString*文本;
NSString*createAt;
}
@属性(副本,非原子)NSString*名称;
@属性(复制,非原子)NSString*屏幕名称;
@属性(复制,非原子)NSString*文本;
@属性(复制,非原子)NSString*createAt;
@结束
  • 最重要的不是您对allTweets数组使用什么属性,而是如何定义Tweet的属性。如果它们不是
    retain
    ,它将崩溃

  • 这是什么

    Tweet*aTweet=[[Tweet alloc]init]
    aTweet=[allTweets objectAtIndex:row]

  • 您应该将
    autorelease
    添加到
    cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]
    cellForRowAtIndexPath:
    和to
    Tweet*theTweet=[[Tweet alloc]init]
    parseTweetJSON:


  • 您确信parseTweetJSON:是在viewDidLoad之后调用的吗?@Denis是的,我只是更新了我的viewDidLoad方法。你能看看吗?当你运行控制台时,控制台上打印了什么?您在
    parseTweetJSON
    中调用NSLog可能会提示问题所在。除此之外,如果您将
    allTweets
    属性设置为
    retain
    ,则应使用
    [NSMutableArray arraywhithcapacity:50]
    @LuizCarlosQuerinoFilho NSLog对其进行初始化。它会打印所有最近的正确推文。什么叫parseTweetJSON?viewDidLoad不叫它…我使用的是带有自动引用计数的Xcode 4.2,
    发布
    自动释放
    不可用。那么请明确说明您在问题中使用了ARC。Xcode版本与ARC使用没有任何联系。在任何情况下,请显示您的Tweet类定义。看起来不错。我找不到问题。不过,我认为你的阵列一切正常。您的异常通常意味着isEqualToString:被发送到解除分配的字符串对象。现在,在您的Tweet中,还有一些其他对象存在于同一地址。因此,您需要找到字符串对象可能被错误释放的位置。我发现了问题,
    -(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(nsindepath*)indepath
    此委托方法崩溃。
    -(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(nsindepath*)indepath{CGSize labelsize;UILabel*textDesc1=[[UILabel alloc]init];[textDesc1 setNumberOfLines:0];textDesc1.text=[self.allTweets objectAtIndex:indexPath.row];[textDesc1 SetFontWithName:@“Helvetica”size:14.0];labelsize=[textDesc1.text SizeFont:textDesc1.font constrainedToSize:CGSizeMake(2682000.0)lineBreakMode:uilinebreakmodewrap];labelsize.height=labelsize.height+35;return(CGFloat)labelsize.height;}