Iphone 目标C。获取表中的NSMutableArray
我试图在TableView中获取数组的数据,但始终出现错误的访问错误。我的代码如下所示: NewsViewController.hIphone 目标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
#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的呼叫之间