-3

hi i have 2 classes one is plisreader which is following code

//
//  PlistReader.h
//  NationalAntemsAndFlags
//
//  Created by mac on 12/17/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "CountryClass.h"

@interface PlistReader : NSObject
{
    NSDictionary *temp;
}
@property (nonatomic,retain) NSDictionary *temp;

-(int)LengthOfPList;
-(id)GetTheObjectById:(NSString*)ObjId;
-(void)initWithFileName:(NSString*)fileName;
- (id)getCountryInfoById:(int)id;
@end

//implementation file

//
//  PlistReader.m
//  NationalAntemsAndFlags
//
//  Created by mac on 12/17/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "PlistReader.h"

@implementation PlistReader
@synthesize temp;


-(id)init
{
    if(self =[super init])
    {

    }
    return self;
}
-(void)initWithFileName:(NSString*)fileName
{
    // Data.plist code
    // get paths from root direcory

    NSArray *paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
    // get documents path
    NSString *documentsPath = [paths objectAtIndex:0];
    // get the path to our Data/plist file
    NSString *plistPath = [documentsPath stringByAppendingPathComponent:[fileName stringByAppendingString:@"plist"]];

    // check to see if Data.plist exists in documents
    if (![[NSFileManager defaultManager] fileExistsAtPath:plistPath])
    {
        // if not in documents, get property list from main bundle
        plistPath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"];
    }

    // read property list into memory as an NSData object
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    // convert static property liost into dictionary object
    temp =(NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    if (!temp)
    {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }
    // assign values

}

-(int)LengthOfPList
{
    return temp.count;
}
-(id)GetTheObjectById:(NSString*)ObjId
{

   return [temp objectForKey:ObjId];

}
-(id)getCountryInfoById:(int)objId
{

    NSString *objsId = [NSString stringWithFormat:@"%d",objId];
    NSDictionary *CDirectory = (NSDictionary*) [self GetTheObjectById:objsId];
    int count = CDirectory.count;
    if(count>0)
    {
        CountryClass *objCountry = [[CountryClass alloc] init];   
        objCountry.Name= [CDirectory objectForKey:@"Name"];
        objCountry.LocationX =[[CDirectory objectForKey:@"PositionX"] intValue];
        objCountry.LocationY = [[CDirectory objectForKey:@"PositionY"] intValue];
        objCountry.ImageUrl = [CDirectory objectForKey:@"ImageUrl"];
        objCountry.AnthemUrl =[CDirectory objectForKey:@"AnthemUrl"];
        objCountry.ShortDetail =[CDirectory objectForKey:@"short Info"];
        objCountry.completeDetails = [CDirectory objectForKey:@"Details"];
        id ObjCountryInfo= objCountry;
        [objCountry release];
        return ObjCountryInfo;
    }
    return NULL;
}

-(void)dealloc
{
    NSLog(@"dealloc plist");
    [temp release];
    [super dealloc];
}




@end

and the other is country class which has following code

//
//  CountryClass.h
//  NationalAntemsAndFlags
//
//  Created by mac on 12/17/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface CountryClass : NSObject
{
    NSString *Name ;
    NSString *ImageUrl;
    NSString *AnthemUrl;
    NSString *ShortDetail;
    NSString *completeDetails;
    int LocationX ;
    int LocationY ;


}
@property (nonatomic,retain) IBOutlet NSString *Name;
@property (nonatomic,retain) IBOutlet NSString *ImageUrl;
@property (nonatomic,retain) IBOutlet NSString *AnthemUrl;
@property (nonatomic,retain) IBOutlet NSString *ShortDetail;
@property (nonatomic,retain) IBOutlet NSString *completeDetails;
@property (nonatomic) IBOutlet int LocationY;
@property (nonatomic) IBOutlet int LocationX;



@end

implementation file

//
//  CountryClass.m
//  NationalAntemsAndFlags
//
//  Created by mac on 12/17/11.
//  Copyright (c) 2011 __MyCompanyName__. All rights reserved.
//

#import "CountryClass.h"

@implementation CountryClass

@synthesize Name,ImageUrl,AnthemUrl,ShortDetail,completeDetails,LocationX,LocationY;


@end

so i called this in my scene like this

-(void)LoadData:(int)countryId
{
    CId = countryId;
    PlistReader *pList =[[PlistReader alloc]init];
    [pList initWithFileName:@"CountryDetails"];   

    CountryClass *objcountry = (CountryClass*) [pList getCountryInfoById:countryId];

    NSString *tempLongDetails = objcountry.completeDetails;
    NSString *tempShortDetails = objcountry.ShortDetail;
    NSString *fileName =  objcountry.ImageUrl ;
    CCSprite *flag ;

    NSString * fullPath = [[NSBundle mainBundle] pathForResource: [fileName stringByDeletingPathExtension]
                                                             ofType: [fileName pathExtension]
                                                           inDirectory: @"CountryFlags"];


    NSLog(fullPath);
    if (fullPath)
    {
       UIImage  *theImage = [UIImage imageWithContentsOfFile: fullPath];
       if (theImage)
       {
            flag = [CCSprite spriteWithCGImage: [theImage CGImage] key: fileName];
           // flag = [CCSprite spriteWithFile:fileName];
            flag.position = ccp(200, 265);
           flag.scale = .255;
       }
    }



    TextViewTopFlagData = [[UITextView alloc]init];
    TextViewTopFlagData.text = tempShortDetails;
    TextViewTopFlagData.frame = CGRectMake(260,17, 105, 75);
    TextViewTopFlagData.backgroundColor = [UIColor clearColor];
    [TextViewTopFlagData setEditable:NO];


    TextViewDownFlagData = [[UITextView alloc]init];
    TextViewDownFlagData.text = tempLongDetails;
    TextViewDownFlagData.frame = CGRectMake(22,240, 242, 61);
    TextViewDownFlagData.backgroundColor = [UIColor clearColor];
    [TextViewDownFlagData setEditable:NO];
    [[[CCDirector sharedDirector]openGLView]addSubview:TextViewTopFlagData];
    [[[CCDirector sharedDirector]openGLView]addSubview:TextViewDownFlagData];
    [self addChild:flag];

}

@end

but at the end of the function objcountry will be empty or out of reference can any one explain me that why this is happaning

Martin Gordon
  • 36,329
  • 7
  • 58
  • 54
  • 4
    Please only include code that actually references the problem you are talking about, this is far too long. – jrturton Dec 19 '11 at 16:40
  • i thought may be people can't understand what i am trying to say that why i put all the code here main problem is that objcountry lost value or destroyed at the end of the function so why is happening that – precious.logic Dec 19 '11 at 16:45
  • @precious.logic You can edit this question using the "edit" link below it. No need to delete and repost. – Adam Lear Dec 22 '11 at 05:20

2 Answers2

0

Just glancing though your code, this jumps out at me :

temp =(NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];

You need to retain it, like this :

temp = [(NSDictionary *)[NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc] retain];

This won't help your bug but it's good practice not to retain properties that have a mutable subclass (i.e. NSString has NSMutableString, NSSet has NSMutableSet, NSDictionary has NSMutableDictionary). It's better (safer) to copy them instead. i.e.

@property (nonatomic, retian) NSString *name; // worse
@property (nonatomic, copy) NSString *name; // better

For the reasons why, read the accepted answer here

Community
  • 1
  • 1
deanWombourne
  • 38,189
  • 13
  • 98
  • 110
0

Is there a meaning this function is returning (id) instead of (CountryClass*)

-(id)getCountryInfoById:(int)objId
{

    NSString *objsId = [NSString stringWithFormat:@"%d",objId];
    NSDictionary *CDirectory = (NSDictionary*) [self GetTheObjectById:objsId];
    int count = CDirectory.count;
    if(count>0)
    {
        CountryClass *objCountry = [[CountryClass alloc] init];   
        objCountry.Name= [CDirectory objectForKey:@"Name"];
        objCountry.LocationX =[[CDirectory objectForKey:@"PositionX"] intValue];
        objCountry.LocationY = [[CDirectory objectForKey:@"PositionY"] intValue];
        objCountry.ImageUrl = [CDirectory objectForKey:@"ImageUrl"];
        objCountry.AnthemUrl =[CDirectory objectForKey:@"AnthemUrl"];
        objCountry.ShortDetail =[CDirectory objectForKey:@"short Info"];
        objCountry.completeDetails = [CDirectory objectForKey:@"Details"];
        id ObjCountryInfo= objCountry;
        [objCountry release];
        return ObjCountryInfo;
    }
    return NULL;
}

Your problem is that you release the objCountry before returning it and referencing it to an id-object.

    id ObjCountryInfo= objCountry;
    [objCountry release];
    return ObjCountryInfo;

My suggestion is not to release the countryObject in this method (release it when you are done with it) and changing the return-type to CountryClass*

Andreas Helgegren
  • 1,640
  • 12
  • 11