Iphone 目标C。获取表中的NSMutableArray

Iphone 目标C。获取表中的NSMutableArray,iphone,objective-c,ios,nsmutablearray,Iphone,Objective C,Ios,Nsmutablearray,我试图在TableView中获取数组的数据,但始终出现错误的访问错误。我的代码如下所示: NewsViewController.h #import "StatusMessage.h" @interface NewsViewController : UIViewController { IBOutlet UITableView *table; NSMutableArray *statusMessages; } @property(nonatomic, retain) NSMu

我试图在TableView中获取数组的数据,但始终出现错误的访问错误。我的代码如下所示:

NewsViewController.h

#import "StatusMessage.h"

@interface NewsViewController : UIViewController {
    IBOutlet UITableView *table;
    NSMutableArray *statusMessages; 
}

@property(nonatomic, retain) NSMutableArray *statusMessages;

@end
NewsViewController.m

#import "NewsViewController.h"
#import "TBXML.h"

@implementation NewsViewController

@synthesize statusMessages;

-(void) getXML {
    //some XML things parsing above

    for (int i = 0; i smaller [allMessages count]; i++) {
        statusMessage *temp = [[StatusMessage alloc]init];

        NSLog(@"retain count %d", [statusMessages retainCount]); //is 1
        [temp initstatusMessage: str1:str2:str3:str4];

        [statusMessages addObject: temp];
        NSLog(@"retain count %d", [statusMessages retainCount]); // is 1
        [temp release];
    }   
}

-(void) getLda {    
    self.getXML;
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1

    NSComparisonResult dateSort(StatusMessage *d1, StatusMessage *d2, void *context) {
        return [[d2 getDate] compare:[d1 getDate]];
    }       

    [statusMessages sortUsingFunction:dateSort context:nil];
}

- (void)loadView {
    [[self navigationController] setNavigationBarHidden:NO animated:NO];
    table.backgroundColor = [UIColor clearColor];   
    [super loadView];
}



- (void)viewDidLoad {   
    [super viewDidLoad];

    statusMessages = [[NSMutableArray alloc] initWithObjects:nil];  
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1    

    self.getLda;
    NSLog([[statusMessages objectAtIndex:1] getText]); //works fine for every index
}

- (void)dealloc {
    [statusMessages release];   
    [super dealloc];    
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [statusMessages count];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;   
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1 every time

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = [[statusMessages objectAtIndex:indexPath.section] getText];
    cell.textLabel.font = [UIFont systemFontOfSize:15];

    return cell;    
}
新闻信息

#import 


@interface statusMessage : NSObject {
    NSString *source;
    NSString *text;
    NSString *date;
    NSURL    *link; 
}

-(void) initstatusMessage: (NSString *) s: (NSString *) t: (NSString *) l:(NSString *) d;
-(NSString *) getText;
-(NSDate   *) getDate;

@end
新闻消息

#import "statusMessage.h"


@implementation statusMessage

-(void) initstatusMessage: (NSString *) s: (NSString *) t: (NSString *) l:(NSString *) d {
    source = s;
    link   = [[NSURL alloc] initWithString:l];

    text = t;

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-ddeHH:mm:ssZZZZ"];
    date = [formatter dateFromString: d]; 
}

-(NSString *) getText {
    return (NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding (kCFAllocatorDefault , text, CFSTR(""), kCFStringEncodingUTF8);
}

-(NSDate *) getDate {
    return date;
}

@end

我无法访问cellForRowAtIndexPath方法中的数据。

设置表视图不仅仅是“cellForRowAtIndexPath”方法。您还必须实现其他一些方法。e、 g

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
还有一些。这还取决于您希望tableview能够实现的功能。 您应该制作一个tableview教程或查看一个教程项目文件,从中可以找到所有必须做的重要事情。
(谷歌搜索“uitableview教程”,网络上有这么多…

设置tableview不仅仅是“cellForRowAtIndexPath”方法。您还必须实现其他一些方法。e、 g

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
还有一些。这还取决于您希望tableview能够实现的功能。 您应该制作一个tableview教程或查看一个教程项目文件,从中可以找到所有必须做的重要事情。 (谷歌搜索“uitableview教程”,网络上有很多内容……

3。(希望是最终的)更新:

将参数传递给函数时,该参数不会被保留。分配变量也是如此。 换言之:

source = s; text = t; date = [formatter dateFromString: d]; 
您的类不保留链接(链接…但是,因为您使用“alloc”)。所以,使用

source = [s retain];
text = [t retain];
date = [[formatter dateFromString: d]retain];
你应该没事的。别忘了在你的dealloc中发布它们

请再次仔细了解内存管理的概念。我不想无礼,但你显然还没有完全学会

希望,我们现在得到了

[文章的其余部分被删除,因为大部分内容都是猜测。]

3。(希望是最终的)更新:

将参数传递给函数时,该参数不会被保留。分配变量也是如此。 换言之:

source = s; text = t; date = [formatter dateFromString: d]; 
您的类不保留链接(链接…但是,因为您使用“alloc”)。所以,使用

source = [s retain];
text = [t retain];
date = [[formatter dateFromString: d]retain];
你应该没事的。别忘了在你的dealloc中发布它们

请再次仔细了解内存管理的概念。我不想无礼,但你显然还没有完全学会

希望,我们现在得到了


[文章的其余部分被删除,因为大部分内容都是猜测。]

您也过度保留了您的阵列,您确实:

[[NSMutableArray alloc] initWithObjects:nil] retain];
当你真正需要的时候:

[[NSMutableArray alloc] initWithObjects:nil];

由于alloc/init也将保留计数保留为1。

您也过度保留了数组,因此您需要:

[[NSMutableArray alloc] initWithObjects:nil] retain];
当你真正需要的时候:

[[NSMutableArray alloc] initWithObjects:nil];

因为alloc/init将保留计数也保留为1。

“不工作”是非常模糊的。到底发生了什么?你的应用程序是否崩溃,
getText
是否只返回
nil
或空字符串?是的,sry,我不够精确。我认为这是一个内存管理问题。我从getText得到一个文本,但它不是wright文本,有些文本不完整(开头的一些字母不在那里),对于其他文本,我只得到奇怪的字母(中文、、方块…)。如果我滚动表格(文本再次加载),应用程序将崩溃,并显示EXC_BAD_ACCESS”。有时它会在第一次调用cellForRowAtIndexPath时提前崩溃。我只想补充一点,在
init
之后不需要
retain
。还要注意,
viewDidLoad
可能会被多次调用。“不工作”是非常模糊的。到底发生了什么?你的应用程序是否崩溃,
getText
是否只返回
nil
或空字符串?是的,sry,我不够精确。我认为这是一个内存管理问题。我从getText得到一个文本,但它不是wright文本,有些文本不完整(开头的一些字母不在那里),对于其他文本,我只得到奇怪的字母(中文、、方块…)。如果我滚动表格(文本再次加载),应用程序将崩溃,并显示EXC_BAD_ACCESS”。有时它会在第一次调用cellForRowAtIndexPath时提前崩溃。我只想补充一点,在
init
之后不需要
retain
。还要注意,
viewDidLoad
可能会被多次调用。好的,sry,我不够精确。问题不在桌子上。我认为这是一个内存管理问题。如果我尝试NSLog([[statusMessages objectAtIndex:indexath.section]getText]),也会出现同样的问题;在cellForRowAtIndexPath方法中。我得到了一个“EXC\u BAD\u ACCESS”。好吧,sry,我不够精确。问题不在桌子上。我认为这是一个内存管理问题。如果我尝试NSLog([[statusMessages objectAtIndex:indexath.section]getText]),也会出现同样的问题;在cellForRowAtIndexPath方法中。我得到了一个“EXC_BAD_ACCESS”。“getLda”看起来像这样:{StatusMessage*temp=[[StatusMessage alloc]init]retain];[temp initstatusMessage:str1:str2:str3:str4];[statusMessages addObject:temp];}这就是一切。而且(当然)getLda被调用了不止一次,否则数组就不会很有用。这种方法中没有任何东西会导致崩溃。但是,您应该再次查看保留计数。最后*temp的retain计数为+3(alloc、retain(这是不必要的)和addObject),因此您应该去掉方法末尾的retain和release temp。要解决最初的问题,您可能需要发布整个NewsViewController(请不要在注释中:),一定有某个地方您意外释放或覆盖了该数组。或者只需查看我的更新。由于我没有完整的代码,这是另一个猜测,但也许这次我是对的。嗨,谢谢你的帮助,我在上面的问题中添加了代码。“新闻邮件”的保留计数始终为1。我没有得到的是:在数组中保存内容后,我可以毫无问题地访问“viewDidLoad”中数组的每个元素。所以问题发生在这条线和cellFo的呼叫之间