title: In objective-c, by using self in a view controller, does this create a strong reference cycle?
body: <p>I've noticed while working with Objective-C, the compiler throws error symbols enforcing the use of either self or an underscore when using a property which I think doesn't happen as harshly when using Swift.  I'm now at the crossroads where I believe my view controller isn't being deallocated  from the navigation stack.  I've used self pretty heavily in order to silence the error symbols but I don't know if this has created retain cycles or not?</p>
  
  <pre><code>#import "MenuController.h"
  #import "AppDelegate.h"
  #import "CMUser.h"
  #import "NotificationsSettingsController.h"
  #import "PersonalInfoController.h"
  #import "BeLive-Swift.h"
  #import "LoginAndSecurityController.h"
  #import "SplashController.h"
  
  
  #define kCellSeparatorTag 100
  
  @implementation SideMenuCell
  
  - (void)layoutSubviews{
      [super layoutSubviews];
  }
  
  @end
  
  @interface MenuController ()&lt;UITableViewDataSource ,UITableViewDelegate&gt;
  @property (nonatomic, strong) NSArray *menuTitles;
  @property (nonatomic, weak) IBOutlet  UITableView *tableView;
  @property (weak, nonatomic) IBOutlet UILabel *usersNameLabel;
  @property (weak, nonatomic) IBOutlet UILabel *usersEmailLabel;
  @property (weak, nonatomic) IBOutlet UILabel *addPhotoLabel;
  @property (weak, nonatomic) IBOutlet SettingsHeaderViewWithPhoto *settingsHeaderViewWithPhoto;
  @end
  
  @implementation MenuController
  
  NSString *userFirstNameString;
  NSString *userLastNameString;
  NSString *userEmailString;
  NSMutableString * usersFullNameString;
  
  + (instancetype)controller{
      static MenuController *sharedInstance = nil;
      static dispatch_once_t onceToken;
      dispatch_once(&amp;onceToken, ^{
          sharedInstance = ControllerFromMainStoryBoard([self description]);
      });
      return sharedInstance;
  }
  
  
  
  - (void) viewWillAppear:(BOOL)animated{
      [super viewWillAppear:animated];
      [self.settingsHeaderViewWithPhoto.backButton addTarget:self action:@selector(popViewCon:) forControlEvents:UIControlEventTouchUpInside];
      [self.settingsHeaderViewWithPhoto.rightButton addTarget:self action:@selector(logoutTapped:) forControlEvents:UIControlEventTouchUpInside];
  }
  
  -(void)showUserInfoInHeaderView{
      if (userEmailString.length != 0) {
          self.settingsHeaderViewWithPhoto.emailSubLabel.text = userEmailString;
      } else {
          self.settingsHeaderViewWithPhoto.emailSubLabel.text = @"Email not available";
      }
      if (usersFullNameString.length != 0) {
          self.settingsHeaderViewWithPhoto.nameLabel.text = usersFullNameString;
      } else {
          self.settingsHeaderViewWithPhoto.nameLabel.text = @"Full name not available";
      }
      [self setMenuArrayBasedOnUserType];
      [self.tableView reloadData];
  }
  
  -(void)setMenuArrayBasedOnUserType{
      if (CMUser.currentUser.type == UserTypeArtist) {
          self.menuTitles = @[@[@"Notifications", @"Stripe Info", @"Personal Info", @"Login and Security", @"Invite a Friend", @"Help", @"Legal Agreement"]];
          [self.tableView reloadData];
      } else if (CMUser.currentUser.type == UserTypeViewer){
          self.menuTitles = @[@[@"Notifications", @"Personal Info", @"Login and Security", @"Invite a Friend", @"Help", @"Legal Agreement"]];
          [self.tableView reloadData];
      } else {
          [self showLoggedInAlert];
      };
  }
  
  -(void)showLoggedInAlert{
      UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Session Time Out"
                                                                     message:@"You must be logged in first."
                                                              preferredStyle:UIAlertControllerStyleAlert]; // 1
      UIAlertAction *firstAction = [UIAlertAction actionWithTitle:@"OK"
                                                            style:UIAlertActionStyleDefault handler:^(UIAlertAction * action) {
                                                                NSLog(@"You pressed ok");
                                                                UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
                                                                SplashController *vc = [sb instantiateViewControllerWithIdentifier:@"SplashController"];
                                                                [self presentViewController:vc animated:YES completion:nil];
  
                                                            }];
      [alert addAction:firstAction];
      [self presentViewController:alert animated:YES completion:nil];
  }
  
  -(void)getLoggedInUserInfo{
      [NetworkManager callEndPoint:USER_DETAILS withDict:nil method:@"GET" JSON:YES success:^(id responseObject) {
          userFirstNameString = responseObject[@"data"][0][@"firstname"];
          userLastNameString = responseObject[@"data"][0][@"lastname"];
          userEmailString = responseObject[@"data"][0][@"emailAddress"];
          usersFullNameString = [NSMutableString stringWithString:userFirstNameString];
          [usersFullNameString appendString:@" "];
          [usersFullNameString appendString: userLastNameString];
          [self showUserInfoInHeaderView];
      } failure:^(id responseObject, NSError *error) {
          NSLog(@"callEndPoint error is: %@", error);
      }];
  }
  
  
  -(void)showProfilPhoto{
      if ([CMUser currentUser][@"imageUrl"] != NULL) {
          self.settingsHeaderViewWithPhoto.addPhotoLabel.text = @"";
          [self.settingsHeaderViewWithPhoto.userPhotoButton sd_setImageWithURL:[NSURL URLWithString:[CMUser currentUser][@"imageUrl"]]forState:UIControlStateNormal];
      } else {
          self.settingsHeaderViewWithPhoto.addPhotoLabel.text = @"Add Photo";
      }
  }
  
  - (void)viewDidLoad {
      [super viewDidLoad];
      self.navigationBarHidden = YES;
      [self.tableView registerClass:[SettingsTableViewCell class] forCellReuseIdentifier:@"MenuCell"];
      self.tableView.backgroundColor = [UIColor colorWithHex:0x222222];
      [self getLoggedInUserInfo];
      [self showProfilPhoto];
  }
  
  
  
  - (void)viewWillLayoutSubviews{
      [super viewWillLayoutSubviews];
      CGFloat revealWidth = ApplicationDelegate.drawerController.maximumLeftDrawerWidth;
      CGRect frame = self.view.frame;
      frame.size.width = revealWidth;
      self.view.frame = frame;
      self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
  }
  
  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
      return self.menuTitles.count;
  }
  
  - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
      NSMutableArray *menuItems = self.menuTitles[section];
      return menuItems.count;
  }
  
  - (UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
  
      NSArray *menuItems = self.menuTitles[indexPath.section];
  
      SettingsTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MenuCell"
                                                              forIndexPath:indexPath];
  
      cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
      cell.textLabel.text = menuItems[indexPath.row];
  
      UIView *separatorView = [cell.contentView viewWithTag:kCellSeparatorTag];
      if (!separatorView) {
          CGFloat revealWidth = ApplicationDelegate.drawerController.maximumLeftDrawerWidth;
          separatorView = [[UIView alloc] initWithFrame:CGRectMake(10, 43, revealWidth - 20, 1)];
  
          separatorView.backgroundColor = [UIColor darkGrayColor];
          [cell.contentView addSubview:separatorView];
      }
  
      return cell;
  }
  
  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
      [tableView deselectRowAtIndexPath:indexPath
                               animated:YES];
      if (indexPath.section == 0) {
          switch (indexPath.row) {
              case 0:
                  [self notificationsTapped];
              default:
                  break;
          }
          switch (indexPath.row) {
              case 1:
                  //TODO: IF userrole == artist then show stripe info else if userrole == , show person information
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show strip credit info");
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"Show personal info");
                      [self personalInfoTapped];
                  }
                  break;
              default:
                  break;
          }
          switch (indexPath.row) {
              case 2:
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show strip personal info");
                      [self personalInfoTapped];
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"Show login and security");
                      [self loginSecurityTapped];
                  }
                  break;
              default:
                  break;
          }
          switch (indexPath.row) {
              case 3:
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show login and security");
                      [self loginSecurityTapped];
  
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"Show Invite a friend");
                      [self inviteFriendTapped];
                  }
                  break;
              default:
                  break;
          }
          switch (indexPath.row) {
              case 4:
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show Invite a friend");
                      [self inviteFriendTapped];
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"Show Help");
                      //goto: webURL www.belive.com/help
                      [self helpTapped];
                  }
                  break;
              default:
                  break;
          }
          switch (indexPath.row) {
              case 5:
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show help");
                      //goto: webURL www.belive.com/help
                      [self helpTapped];
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"Show legal agreement");
                      //goto: webURL www.belive.com/legal
                      [self legalAgreementTapped];
                  }
                  break;
              default:
                  break;
          }
          switch (indexPath.row) {
              case 6:
                  if (CMUser.currentUser.type == UserTypeArtist) {
                      NSLog(@"Show legal agreement");
                      //goto: webURL www.belive.com/legal
                      [self legalAgreementTapped];
  
                  } else if (CMUser.currentUser.type == UserTypeViewer)  {
                      NSLog(@"do nothing because there is not a value for this case.");
                  }
                  break;
              default:
                  break;
          }
      }
  }
  
  - (void)notificationsTapped{
      NotificationsSettingsController *vc = [NotificationsSettingsController controller];
      [self.navigationController pushViewController:vc
                                           animated:YES];
  }
  
  
  
  - (void)popViewCon: (UIButton*)sender{
      [ApplicationDelegate toggleMenu];
  }
  
  
  
  - (void)logoutTapped: (UIButton*)sender{
      [ApplicationDelegate toggleMenu];
      [CMUser logOut];
      [ApplicationDelegate setController];
  }
  
  
  -(void)personalInfoTapped{
      UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
      PersonalInfoController *vc = [sb instantiateViewControllerWithIdentifier:@"PersonalInfoController"];
      vc.usersProfilePhoto = self.settingsHeaderViewWithPhoto.userPhotoButton.imageView.image;
      [self.navigationController pushViewController:vc animated:YES];
  }
  
  -(void)loginSecurityTapped{
      UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
      LoginAndSecurityController *vc = [sb instantiateViewControllerWithIdentifier:@"LoginAndSecurityController"];
      //LoginAndSecurityController *vc = [LoginAndSecurityController controller];
      [self.navigationController pushViewController:vc animated:YES];
  }
  
  -(void)inviteFriendTapped{
      UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
      InviteFriendController
      *vc = [sb instantiateViewControllerWithIdentifier:@"InviteFriendController"];
      [self.navigationController pushViewController:vc animated:YES];
  }
  
  -(void)helpTapped{
      UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
      HelpController *vc = [sb instantiateViewControllerWithIdentifier:@"helpController"];
      [self.navigationController pushViewController:vc animated:YES];
  }
  
  -(void)legalAgreementTapped{
      UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Settings" bundle:nil];
      LegalAgreementController *vc = [sb instantiateViewControllerWithIdentifier:@"legalController"];
      [self.navigationController pushViewController:vc animated:YES];
  }
  - (IBAction)addPhotoButtonTapped:(UIButton *)sender {
      [self configureAddPhotoActionSheet];
  }
  
  -(void)configureAddPhotoActionSheet{
      UIAlertController *actionSheet = [UIAlertController alertControllerWithTitle:nil message:nil preferredStyle:UIAlertControllerStyleActionSheet];
  
      [actionSheet addAction:[UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:^(UIAlertAction *action) {
  
  
  
          // Cancel button tappped do nothing.
  
      }]];
  
      [actionSheet addAction:[UIAlertAction actionWithTitle:@"Take a Photo" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
  
          // take photo button tapped.
          [self takePhoto];
  
      }]];
  
      [actionSheet addAction:[UIAlertAction actionWithTitle:@"Choose Photo from Library" style:UIAlertActionStyleDefault handler:^(UIAlertAction *action) {
  
          // choose photo button tapped.
          [self selectPhoto];
  
      }]];
  
  
  
      [self presentViewController:actionSheet animated:YES completion:nil];
  }
  
  - (void)takePhoto{
      UIImagePickerController *picker = [[UIImagePickerController alloc] init];
      picker.delegate = self;
      picker.allowsEditing = YES;
      picker.sourceType = UIImagePickerControllerSourceTypeCamera;
  
      [self presentViewController:picker animated:YES completion:NULL];
  }
  
  - (void)selectPhoto{
      UIImagePickerController *picker = [[UIImagePickerController alloc] init];
      picker.delegate = self;
      picker.allowsEditing = YES;
      picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
  
      [self presentViewController:picker animated:YES completion:NULL];
  }
  
  
  //UIImagePickerDelegate Methods
  /*
  -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary&lt;NSString *,id&gt; *)info{
      UIImage *chosenImage = info[UIImagePickerControllerEditedImage];
  
      [self.profilePictureButton setImage:chosenImage forState:UIControlStateNormal];
      self.addPhotoLabel.text = @"";
      [self updateProfilePicture:chosenImage];
      [picker dismissViewControllerAnimated:YES completion:NULL];
  }
  - (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
  
      [picker dismissViewControllerAnimated:YES completion:NULL];
  } */
  
  - (void)updateProfilePicture:(UIImage*)image{
      NSData *imageData = UIImageJPEGRepresentation(image, 0.5);
      NSString *imageString = [NSString stringWithFormat:@"data:image/png;base64,%@", [imageData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength]];
      NSDictionary *params = @{@"ImageFileContent" : imageString,
                               @"ImageName" : @"image.jpg"
                               };
      NSString *uploadEndPoint = @"artist/add-artist-photo";
      MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.settingsHeaderViewWithPhoto.userPhotoButton animated:YES];
      [NetworkManager callEndPoint:uploadEndPoint
                          withDict:params
                            method:@"POST"
                              JSON:YES
                           success:^(id responseObject) {
                               NSLog(@"The response object has: %@", responseObject);
                               [CMUser currentUser][@"imageUrl"] = responseObject[@"data"][0][@"imageURL"];
                               [[CMUser currentUser] setCurrent];
                               [HUD hideAnimated:YES];
                           } failure:^(id responseObject, NSError *error) {
                               [HUD hideAnimated:YES];
                           }];
  }
  
  @end
  </code></pre>