1

In my application i have called sharedinstance multiple time in multiple method deffinition , Here my code,

Method 1

 -(void) showActionSheet:(id)sender forEvent:(UIEvent*)event
 {
  if(isQuantity==YES)
  {
    [[WebService sharedInstance] getQuantity:^(BOOL result)
     {
      if(result)
     {
      NSLog(@"success");
      NSManagedObjectContext *context = [[DataAccessLayer sharedInstance] managedObjectContext];
      Quantity = [context fetchObjectsForEntityName:NSStringFromClass([GetQuantity class]) withSortColumn:nil withSortDescending:TRUE withPredicate:nil];
             NSLog(@"array ->%@",Quantity);
             isQuantity=NO;
         }
     }];
  }

 popoverController1 = [[TSPopoverController alloc]initWithContentViewController:tableViewController1];
 popoverController1.cornerRadius = 5;
 popoverController1.titleText = @"Quantity";
 popoverController1.popoverBaseColor = [UIColor blackColor];
 popoverController1.popoverGradient= NO;
[popoverController1 showPopoverWithTouch:event];
}

Method 2

-(void) showActionSheetw:(id)sender forEvent:(UIEvent*)events  
 {
if(isSize==YES)
{
    [[WebService sharedInstance] getDimension:^(BOOL result)
     {
         if(result){
              NSLog(@"success");
             NSManagedObjectContext *context = [[DataAccessLayer sharedInstance] managedObjectContext];
             dime = [context fetchObjectsForEntityName:NSStringFromClass([Getdimension class]) withSortColumn:nil withSortDescending:FALSE withPredicate:nil];
             NSLog(@"array ->%@",dime);


         }
     }];
}
popoverController2 = [[TSPopoverController alloc] initWithContentViewController:tableViewController2];
popoverController2.cornerRadius = 5;
popoverController2.titleText = @"Size";
popoverController2.popoverBaseColor = [UIColor blackColor];
popoverController2.popoverGradient= NO;
//    popoverController.arrowPosition = TSPopoverArrowPositionHorizontal;
[popoverController2 showPopoverWithTouch:events];
}

EDIT

 - (void) getDimension:(void (^)(BOOL))handler
{
JBContainedURLConnection *connection = [[JBContainedURLConnection alloc]init ];

[connection initWithGETUrl:IP methodName:GETDIMENSION param:nil andCompletionHandler:^(JBContainedURLConnection *connection, NSError *error, NSString *urlString, NSDictionary *userInfo, NSData *response)
 {
     if(error)
     {
         NSLog(@"Error: %@", error);
         handler(FALSE);
     }
     else
     {
         if(response == nil)
             handler(FALSE);
         else
         {
             NSManagedObjectContext *context = [[DataAccessLayer sharedInstance] managedObjectContext];
             NSArray *existingResults = [context fetchObjectsForEntityName:NSStringFromClass([Getdimension class]) withSortColumn:nil withSortDescending:FALSE withPredicate:nil];
             for (NSManagedObject *obj in existingResults)
                 [context deleteObject:obj];
             [[DataAccessLayer sharedInstance] saveContext];
             id responseData = [self DictionaryFromResponse:response];
             if(responseData == nil)
                 handler(FALSE);

             else
             {
                 NSLog(@"Dimension Response: %@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]);
                 NSArray *data=[responseData objectForKey:@"GetDimensionResult"];
                  NSLog(@"GetDimensionResult :%@",data);
                 for( NSDictionary *dict in data){
                     Getdimension *userDetails = [Getdimension newObject];
                     [userDetails fillFromDictionary:dict];

                 }
                 [[DataAccessLayer sharedInstance] saveContext];
                 handler(TRUE);
             }
         }         }
 }];
}


 - (void) getQuantity:(void (^)(BOOL))handler
 {
 JBContainedURLConnection *connection = [[JBContainedURLConnection alloc]init ];

[connection initWithGETUrl:IP methodName:GETQUANTITY param:nil andCompletionHandler:^(JBContainedURLConnection *connection, NSError *error, NSString *urlString, NSDictionary *userInfo, NSData *response)
 {
     if(error)
     {
         NSLog(@"Error: %@", error);
         handler(FALSE);
     }
     else
     {
         if(response == nil)
             handler(FALSE);
         else
         {
             NSManagedObjectContext *context = [[DataAccessLayer sharedInstance] managedObjectContext];
             NSArray *existingResults = [context fetchObjectsForEntityName:NSStringFromClass([GetQuantity class]) withSortColumn:nil withSortDescending:FALSE withPredicate:nil];
             for (NSManagedObject *obj in existingResults)
                 [context deleteObject:obj];
             [[DataAccessLayer sharedInstance] saveContext];
             id responseData = [self DictionaryFromResponse:response];
             if(responseData == nil)
                 handler(FALSE);

             else
             {
                 NSLog(@"GetQuantityResult Response: %@", [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding]);
                 NSArray *data=[responseData objectForKey:@"GetQuantityResult"];
                // NSLog(@"GetDimensionResult :%@",data);
                 for( NSDictionary *dict in data){
                     GetQuantity *userDetails = [GetQuantity newObject];
                     [userDetails fillFromDictionary:dict];

                 }
                 [[DataAccessLayer sharedInstance] saveContext];
                 handler(TRUE);
             }
         }  }
 }];
 }

Instance method

 + (id)sharedInstance
{
@synchronized(self)
{
    if (manager == nil)
        manager = [[self alloc] init];
}
return manager;
}


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

-(NSString *)NSStringFromDictionaryUsingJSON:(id)dictionary
{
SBJsonWriter *writer = [[SBJsonWriter alloc]init];
return [writer stringWithObject:dictionary];
 }

 -(id)DictionaryFromResponse:(NSData *)response
 {
NSString *responseBody =  [[NSString alloc] initWithData:response encoding:NSASCIIStringEncoding];
SBJsonParser *parser = [[SBJsonParser alloc]init];
return [parser objectWithString:responseBody  error:nil];
}

sharedInstance only works one time,ie,. if i call any of the method first its worked,if calls other method second time app gets crashed.Can any one please help me to sort it out

Globas techn
  • 95
  • 1
  • 6

2 Answers2

0

I guess sharedInstance method is messy.

It should be

+ (id)sharedInstance
{
    if (manager == nil)
        manager = [[self alloc] init];

return manager;
}

Enjoy Programming !

Niru Mukund Shah
  • 4,637
  • 2
  • 20
  • 34
0

Have you declared instance of your class as static, Declare you class object as :

static ClassName *manager;

And the allocate the same object in your sharedInstance method. The reason may be that the memory object was released but reference is still there in the memory.So when you execute the shared instance method it found a reference to !nil object and leads your application to crash.

This is singleton class feature of iOS(objective C)