//
//  Accessing_Variables_in_Block_ObjectsAppDelegate.m
//  Accessing Variables in Block Objects
//
//  Created by Vandad Nahavandipoor on 13/07/2011.
//  Copyright 2011 Pixolity Ltd. All rights reserved.
//

#import "Accessing_Variables_in_Block_ObjectsAppDelegate.h"

@implementation Accessing_Variables_in_Block_ObjectsAppDelegate

@synthesize window = _window;
@synthesize stringProperty;

//void (^independentBlockObject)(void) = ^(void){
//  
//  NSInteger localInteger = 10;
//  
//  NSLog(@"lokalna liczba całkowita = %ld", (long)localInteger);
//  
//  localInteger = 20;
//  
//  NSLog(@"lokalna liczba całkowita = %ld", (long)localInteger);
//  
//};

//- (void) simpleMethod{
//  
//  NSUInteger outsideVariable = 10;
//  
//  NSMutableArray *array = [[NSMutableArray alloc]
//                           initWithObjects:@"obj1",
//                           @"obj2", nil];
//  
//  [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//    NSUInteger insideVariable = 20;
//    
//    NSLog(@"Zmienna zewnętrzna = %lu", (unsigned long)outsideVariable);
//    NSLog(@"Zmienna wewnętrzna = %lu", (unsigned long)insideVariable);
//    
//    /* Wartość zwrotna obiektu bloku. */
//    return NSOrderedSame;
//    
//  }];
//  
//}

//- (void) simpleMethod{
//  
//  __block NSUInteger outsideVariable = 10;
//  
//  NSMutableArray *array = [[NSMutableArray alloc]
//                           initWithObjects:@"obj1",
//                           @"obj2", nil];
//
//  
//  [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//     
//     NSUInteger insideVariable = 20;
//     outsideVariable = 30;
//     
//     NSLog(@"Zmienna zewnętrzna = %lu", (unsigned long)outsideVariable);
//     NSLog(@"Zmienna wewnętrzna = %lu", (unsigned long)insideVariable);
//     
//     /* Return value for our block object */
//     return NSOrderedSame;
//     
//   }];
//  
//}

//- (void) simpleMethod{
//  
//  NSMutableArray *array = [[NSMutableArray alloc]
//                           initWithObjects:@"obj1",
//                           @"obj2", nil];
//  
//  [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//    
//    NSLog(@"self = %@", self);
//    
//    /* Wartość zwrotna obiektu bloku. */
//    return NSOrderedSame;
//    
//  }];
//  
//}


//void (^incorrectBlockObject)(void) = ^{
//  NSLog(@"self = %@", self); /* self is undefined here */
//};

//void (^correctBlockObject)(id) = ^(id self){
//  
//  NSLog(@"self = %@", self);
//  
//};
//
//- (void) callCorrectBlockObject{
//  
//  correctBlockObject(self);
//  
//}

//- (void) simpleMethod{
//  
//  NSMutableArray *array = [[NSMutableArray alloc]
//                           initWithObjects:@"obj1",
//                           @"obj2", nil];
//  
//  [array sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
//    
//    NSLog(@"self = %@", self);
//    
//    self.stringProperty = @"Block Objects";
//    
//    NSLog(@"Właściwość stringProperty = %@", self.stringProperty);
//    
//    /* Wartość zwrotna obiektu bloku. */
//    return NSOrderedSame;
//    
//  }];
//  
//}

//void (^correctBlockObject)(id) = ^(id self){
//  
//  NSLog(@"self = %@", self);
//  
//  /* Zamiast poniższego polecenia należy użyć metody typu setter. */
//  self.stringProperty = @"Block Objects"; /* Błąd w trakcie kompilacji. */
//  
//  /* Zamiast poniższego polecenia należy użyć metody typu getter. */
//  NSLog(@"self.stringProperty = %@", 
//        self.stringProperty); /* Błąd w trakcie kompilacji. */
//  
//};

//void (^correctBlockObject)(id) = ^(id self){
//  
//  NSLog(@"self = %@", self);
//  
//  /* Poniższe polecenie działa doskonale. */
//  [self setStringProperty:@"Block Objects"];
//  
//  /* Poniższe polecenie również działa doskonale. */
//  NSLog(@"self.stringProperty = %@", 
//        [self stringProperty]);
//  
//};

//- (void) callCorrectBlockObject{
//  
//  correctBlockObject(self);
//  
//}

typedef void (^BlockWithNoParams)(void);

//- (void) scopeTest{
//  
//  NSUInteger integerValue = 10;
//  
//  BlockWithNoParams myBlock = ^{
//    NSLog(@"Wartość zmiennej integerValue w bloku = %lu", 
//          (unsigned long)integerValue);
//  };
//  
//  integerValue = 20;
//  
//  /* Wywołanie bloku po zmianie wartości zmiennej integerValue. */
//  myBlock();
//  
//  NSLog(@"Wartość zmiennej integerValue poza blokiem = %lu", 
//        (unsigned long)integerValue);
//  
//}

//- (void) scopeTest{
//  
//  __block NSUInteger integerValue = 10;
//  
//  BlockWithNoParams myBlock = ^{
//    NSLog(@"Wartość zmiennej integerValue w bloku = %lu", 
//          (unsigned long)integerValue);
//  };
//  
//  integerValue = 20;
//  
//  /* Wywołanie bloku po zmianie wartości zmiennej integerValue. */
//  myBlock();
//  
//  NSLog(@"Wartość zmiennej integerValue poza blokiem = %lu", 
//        (unsigned long)integerValue);
//  
//}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
  // Miejsce na przeprowadzenie własnej konfiguracji po uruchomieniu aplikacji.
  self.window.backgroundColor = [UIColor whiteColor];
  [self.window makeKeyAndVisible];
  return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana, gdy aplikacja przechodzi ze stanu aktywnego do nieaktywnego. Może być wywołana w określonych sytuacjach (na przykład w chwili odbywania rozmowy telefonicznej lub po otrzymaniu wiadomości SMS) bądź kiedy użytkownik kończy działanie aplikacji. Metoda rozpoczyna proces przejścia do stanu pozostania w tle. Tę metodę można wykorzystać do wstrzymania wykonywania bieżących zadań, wyłączenia liczników czasu, zmniejszenia liczby klatek generowanych przez OpenGL ES. W grach ta metoda powinna być użyta do wstrzymania gry (pauza).
   */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
  /*
   Tę metodę należy wykorzystać do zwolnienia zasobów współdzielonych, zapisania danych użytkownika, wyzerowania liczników czasu oraz do przechowania takiej ilości informacji o stanie, która pozwoli na przywrócenie aplikacji do stanu bieżącego. Jeżeli aplikacja obsługuje działanie w tle, w chwili kończenia działania należy wywołać tę metodę zamiast applicationWillTerminate:.
   */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana podczas przechodzenia aplikacji ze stanu aktywnego do działania w tle. Można więc tutaj wycofać wiele zmian wprowadzonych w chwili przechodzenia do stanu działania w tle.
   */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
  /*
   W tej metodzie można wznowić działanie zadań zatrzymanych (lub nieuruchomionych), gdy aplikacja była nieaktywna. Jeżeli aplikacja znajdowała się w trybie działania w tle, w metodzie można przeprowadzić odświeżenie interfejsu użytkownika.
   */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
  /*
   Ta metoda jest wywoływana, gdy działanie aplikacji ma zostać zakończone. Zapoznaj się z opisem metody applicationDidEnterBackground:.
   */
}

@end
