Помогите узнать, как решить проблему, используя память в моем приложении, может есть другой способ реализовать мою задачу.
иметь следующий код:
Constants.h
#import <Foundation/Foundation.h>
extern NSString * const ITEM;
extern NSString * const TITLE;
extern NSString * const IMAGE;
extern NSString * const DESCRIPTION;
extern NSString * const TEXT;
@interface Constants : NSObject
{
}
@end
Constants.m
#import "Constants.h"
@implementation Constants
NSString * const ITEM = @"item";
NSString * const TITLE = @"title";
NSString * const IMAGE = @"image";
NSString * const DESCRIPTION = @"description";
NSString * const TEXT = @"text";
- (void)dealloc
{
[super dealloc];
}
@end
myNews.h
#import <Foundation/Foundation.h>
@interface myNews : NSObject
{
NSString *itemTitle;
NSString *itemImageUrl;
NSString *itemDescription;
NSString *itemText;
}
@property (nonatomic, retain) NSString *itemTitle;
@property (nonatomic, retain) NSString *itemImageUrl;
@property (nonatomic, retain) NSString *itemDescription;
@property (nonatomic, retain) NSString *itemText;
@end
myNews.m
#import "myNews.h"
@implementation myNews
@synthesize itemTitle;
@synthesize itemImageUrl;
@synthesize itemDescription;
@synthesize itemText;
@end
XMLController.h
#import <Foundation/Foundation.h>
@class Constants;
@class myNews;
@interface XMLController : NSObject
{
NSMutableString *currentNodeContent;
NSMutableArray *newsArray;
NSXMLParser *parser;
myNews *currentNew;
}
@property (readonly, retain) NSMutableArray *newsArray;
-(id)loadXMLByURL:(NSString *)urlString;
@end
XMLController.m
#import "XMLController.h"
#import "Constants.h"
#import "myNews.h"
@implementation XMLController
@synthesize newsArray;
-(id)loadXMLByURL:(NSString *)urlString
{
newsArray = [[NSMutableArray alloc] init];
NSURL *url = [NSURL URLWithString: urlString];
parser = [[NSXMLParser alloc] initWithContentsOfURL: url];
[parser setDelegate:(id)self];
[parser parse];
return self;
}
-(void) parser:(NSXMLParser *)parser
didStartElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
attributes:(NSDictionary *)attributeDict
{
if ([elementName isEqualToString: ITEM])
{
currentNew = [myNews alloc];
currentNodeContent = [[NSMutableArray alloc] init];
}
}
-(void) parser:(NSXMLParser *)parser
didEndElement:(NSString *)elementName
namespaceURI:(NSString *)namespaceURI
qualifiedName:(NSString *)qName
{
if ([elementName isEqualToString: TITLE])
{
currentNew.itemTitle = currentNodeContent;
}
if ([elementName isEqualToString: IMAGE])
{
currentNew.itemImageUrl = currentNodeContent;
}
if ([elementName isEqualToString: DESCRIPTION])
{
currentNew.itemDescription = currentNodeContent;
}
if ([elementName isEqualToString: TEXT])
{
currentNew.itemText = currentNodeContent;
}
if ([elementName isEqualToString: ITEM])
{
[newsArray addObject:currentNew];
[currentNew release];
currentNew = nil;
[currentNodeContent release];
currentNodeContent = nil;
}
}
-(void) parser:(NSXMLParser *)parser
foundCharacters:(NSString *)string
{
currentNodeContent = [string stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
}
@end
myAppDelegate.h
#import <UIKit/UIKit.h>
#import "MainViewController.h"
#import "DetailViewController.h"
@class MainViewController;
@class DetailViewController;
@interface myAppDelegate : NSObject <UIApplicationDelegate>
{
UIWindow *window;
UINavigationController *myNavigationController;
MainViewController *myMainViewController;
DetailViewController *myDetailViewController;
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UINavigationController *myNavigationController;
@property (nonatomic, retain) IBOutlet MainViewController *myMainViewController;
@property (nonatomic, retain) IBOutlet DetailViewController *myDetailViewController;
@end
myAppDelegate.m
#import "myAppDelegate.h"
#import "myNews.h"
#import "MainViewController.h"
#import "DetailViewController.h"
@implementation myAppDelegate
@synthesize window;
@synthesize myNavigationController;
@synthesize myMainViewController;
@synthesize myDetailViewController;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window addSubview:myNavigationController.view];
[window makeKeyAndVisible];
return YES;
}
- (void)dealloc
{
[window release];
[myNavigationController release];
[myMainViewController release];
[myDetailViewController release];
[super dealloc];
}
@end
MainViewController.h
#import <UIKit/UIKit.h>
#import "XMLController.h"
@interface MainViewController : UIViewController
{
XMLController *xmlcont;
UILabel *myTitleLabel;
// declared here some 10 objects
}
@property (nonatomic, retain) UILabel *myTitleLabel;
@end
MainViewController.m
#import "MainViewController.h"
#import "myNews.h"
@implementation MainViewController
@synthesize myTitleLabel;
- (void)completeRefresh
{
[myMainViewController viewDidLoad];
}
- (void)viewDidLoad
{
[super viewDidLoad];
UIButton *myRefreshButton = [[UIButton alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 35.0f, 23.0f)];
[myRefreshButton setImage:[UIImage imageNamed:@"ButtonRefresh.png"] forState:UIControlStateNormal];
[myRefreshButton addTarget:self
action:@selector(completeRefresh)
forControlEvents:UIControlEventTouchUpInside];
UIBarButtonItem *myRefreshBarButton = [[[UIBarButtonItem alloc] initWithCustomView:myRefreshButton] autorelease];
[self.navigationItem setRightBarButtonItem: myRefreshBarButton];
[myRefreshButton release];
xmlcont = [[XMLController alloc] loadXMLByURL:@"http://link_to_XML_file.xml"];
NSLog(@"array = %@", [xmlcont newsArray]);
for (myNews *oneNew in [xmlcont newsArray]) {
CGRect frameTitleLabel = CGRectMake(0.0f, 200.0f, 320.0f, 60.0f);
myTitleLabel = [[UILabel alloc] initWithFrame:frameTitleLabel];
myTitleLabel.backgroundColor = [UIColor blackColor];
myTitleLabel.text = [myOneNew itemTitle];
myTitleLabel.font = [UIFont fontWithName:@"HelveticaNeue-Bold" size: 17.0];
myTitleLabel.textColor = [UIColor whiteColor];
[self.view addSubview:myTitleLabel];
[myTitleLabel release];
}
}
- (void)viewDidUnload
{
self.myTitleLabel = nil;
[super viewDidUnload];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
- (void)dealloc
{
[myTitleLabel release];
[super dealloc];
}
@end
Во время теста приложение, использующее Instruments: Activity Monitor, показывает, что при нажатии кнопки «Обновить» и вызове «completeRefresh» память (Real Mem) не очищается при перезагрузке viewDidLoad, а накапливается при каждом касании и вызывает «completeRefresh»
Может быть, у кого-то есть возможное решение?