스토리보드는 TextField 3개, 버튼 2개로 구성하였다. ID/PWD를 받는 Textfield 각각 1개씩 그리고 저장 버튼, 불러오기 버튼, 불러오기 버튼을 눌렀을 때 ID와 PWD를 표시해줄 TextField 1개.


#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


- (IBAction)BtnSave:(id)sender;

- (IBAction)BtnLoad:(id)sender;


@property (weak, nonatomic) IBOutlet UITextField *txtF_ID;

@property (weak, nonatomic) IBOutlet UITextField *txtF_Pwd;


@property (weak, nonatomic) IBOutlet UITextField *txtF_Load;


extern NSString* value;

@end



ViewController.m 파일의 소스 코드이다.


#import "ViewController.h"


@interface ViewController ()




@end


@implementation ViewController


- (void)viewDidLoad

{

    [super viewDidLoad];

    NSLog(@"[D] viewDidLoad");

    // Do any additional setup after loading the view, typically from a nib.

}



- (void)didReceiveMemoryWarning

{

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



- (IBAction)BtnSave:(id)sender

{

    @autoreleasepool {

        

        NSLog(@"[D] BtnSave Clicked...");

//        NSString* tmpText = _txtF_ID.text;

//        NSString* tmpText2 = _txtF_Pwd.text;

//        NSLog(@"[D] ID: %@  Passwd: %@",tmpText, tmpText2);

//        NSLog(@"[D] ID: %@  Passwd: %@",_txtF_ID.text, _txtF_Pwd.text);

//        [dic setObject:_txtF_ID.text forKey: @"first"];

//        self.dic = [NSMutableDictionary dic];

//        [dic setString:tmpText forKey:@"First"];

//        _txtF_ID.text = [_txtF_ID.text stringByAppendingString:@"This is ID"];

//        NSLog(@"[D] Append to text: %@", [_txtF_ID.text stringByAppendingString:_txtF_Pwd.text]);

        NSMutableDictionary* dic = [[NSMutableDictionary alloc] init];

        [dic setObject:[_txtF_ID.text stringByAppendingString:_txtF_Pwd.text] forKey: @"first"];


//        NSString* str = [dic objectForKey:@"first"];

//        NSLog(@"[D] Dictionary contents: %@", str);


        NSLog(@"[D] Dictionary contents: %@", [dic objectForKey:@"first"]);

        

        [[NSUserDefaults standardUserDefaults] setObject:[dic objectForKey:@"first"] forKey:@"first"];

        [[NSUserDefaults standardUserDefaults] synchronize];


//        [[NSUserDefaults standardUserDefaults] setObject:dic forKey:@"first"];

//        [[NSUserDefaults standardUserDefaults] synchronize];


        

        id value = [[NSUserDefaults standardUserDefaults] objectForKey:@"first"];

        NSLog(@"[D] NSUserDefaults Contents: %@", value);

        

    } // end of autoreleasepool

    

}


- (IBAction)BtnLoad:(id)sender

{

    NSLog(@"[D] BtnLoad Clicked...");

    NSMutableDictionary* value = [[NSUserDefaults standardUserDefaults] objectForKey:@"first"];

//    NSMutableDictionary* value;

//    [value objectForKey:@"first"];

    NSLog(@"[D] Load NSUserDefaults Contents: %@", value);

    

    _txtF_Load.text = value;

}

@end


수없이 많은 노가다를 거치고 나서 data를 NSDictionary에 넣고 Userdefault로 저장한 후 다시 Userdefault로 data를 불러들이는 걸 할 수 있었다.

스토리보드상에서 TextField에 지워지는 회색 글씨를 띄우려면 attribute inspector 에서 PlaceHolder에 글씨를 써주면 된다. 


Posted by 知彼知己百戰不殆
,

====NSUserDefaults 값 저장====

1. int 값 저장

[[NSUserDefaults standardUserDefaults] setInteger:<int value> forKey:<key value>];

2. bool 값 저장

[[NSUserDefaults standardUserDefaults] setBool:<bool value> forKey:<key value>];

3. object 저장

[[NSUserDefaults standardUserDefaults] setObject:<object> forKey:<key value>];

4. 저장한 데이터 동기화(적용)

[[NSUserDefaults standardUserDefaults] synchronize];


====NSUserDefaults에 저장된 데이터 읽기====

1. int 값 읽기

int value = [[NSUserDefaults standardUserDefaults] integerForKey:<key value>];

2. bool 값 읽기

bool value = [[NSUserDefaults standardUserDefaults] boolForKey:<key value>];

3. NSString 값 읽기 (NSString 값 저장은 NSString 자체가 object이기 때문에 setObject를 이용하면 됨

NSString* value = [[NSUserDefaults standardUserDefaults] stringForKey:<key value>];

4. object 읽기
id value = [[NSUserDefaults standardUserDefaults] objectForKey:<key value>];


출처: http://stormaa.tistory.com/38

Posted by 知彼知己百戰不殆
,

Since you made an install of a new OS you probably don't have any more your private and public key that you used to sign your app in XCode before. You need to regenerate those keys on your machine by revoking your previous certificate and ask for a new one the iOS development portal. As part of the process you will be ask to generate a Certificate Signing Request which is where you seem to have problem.

You will find all u need there which consist of (from the official doc):

1.Open Keychain Access on your Mac (located in Applications/Utilities).

2.Open Preferences and click Certificates. Make sure both Online Certificate Status Protocol and Certificate Revocation List are set to Off.

3.Choose Keychain Access > Certificate Assistant > Request a Certificate From a Certificate Authority.

Note: If you have a private key selected when you do this, the CSR won’t be accepted. Make sure no private key is selected. Enter your user email address and common name. Use the same address and name as you used to register in the iOS Developer Program. No CA Email Address is required.

4.Select the options “Saved to disk” and “Let me specify key pair information” and click Continue.

5.Specify a filename and click Save.

For the Key Size choose 2048 bits and for Algorithm choose RSA. Click Continue and the Certificate Assistant creates a CSR and saves the file to your specified location.


출처: https://stackoverflow.com/questions/12126496/how-to-obtain-certificate-signing-request

Posted by 知彼知己百戰不殆
,

Error 내용:


Pods written in Swift can only be integrated as frameworks; add `use_frameworks!` to your Podfile or target to opt into using it. The Swift Pod being used is: ToastSwift



Error 수정:


# Uncomment the next line to define a global platform for your project

platform :ios, '10.0'


pod 'ToastSwift'

target 'iPhone_Test' do

  # Uncomment the next line if you're using Swift or would like to use dynamic frameworks

  # use_frameworks!


  # Pods for iPhone_Test


  target 'iPhone_TestTests' do

    inherit! :search_paths

    # Pods for testing

  end


  target 'iPhone_TestUITests' do

    inherit! :search_paths

    # Pods for testing

  end


use_frameworks!


end


Podfile의 맨 끝에 use_frameworks!를 추가해준다.

Posted by 知彼知己百戰不殆
,

1. sudo gem install cocoapods

Cocoapods 설치

2. pod setup


3. pod init

해당 디렉토리에서 pod를 초기화 해줌(Podfile 자동 생성)

4. pod install


Posted by 知彼知己百戰不殆
,

이런 에러가 생겼을 경우

Here are some things that can fix this (in increasing order of difficulty):

  • Clean the project (Product > Clean)
  • Completely close Xcode and restart your project.
  • Delete the Derived Data folder (Window > Projects > click Delete button by Derived Data.) (Update: In Xcode 8 this location no longer appears. Supposedly Xcode cleans up Derived Data by itself. If you want to delete it manually you can find the folder yourself by going to Preferences > Locations and clicking the gray arrow by the Derived Data folder. Then delete your project folder.)
  • Click delete on the class, remove reference (not Move to Trash), and add it back again. (see this answer)


Posted by 知彼知己百戰不殆
,


XCode 8.2.1 버전에서 코드를 작성하다가 빌드 시 오류가 난 부분이다. 구글링을 해보니 'Garbage collection이 기본으로 설정되어 있어 소스상에서 레퍼런스 카운트를 이용한 메모리 관리 방식의 키워드를 사용하면 아래와 같이 에러가 난다'라고 한다.

이런 경우 XCode의 프로젝트 네비게이터에서 프로젝트의 이름을 클릭하면 속성화면이 나오는데 여기서 Build Settings의 'Objective - C Automatic Reference Counting'값이 아래와 같이 'Yes'로 되어있는 것을 'NO'로 수정해주면 에러없이 빌드가 가능해진다. 라고 써있으나.... 내 XCode에는 그런 속성이 없었다. 그래서 재구글링을 통해 알아본 결과 

[obj release]열만 제거를 하면 된다길래 [[SecondViewController new] autorelease];에서 autorelease를 제거하여 [SecondViewController new]만 남겨놓았더니 오류없이 빌드가 됐다.








Posted by 知彼知己百戰不殆
,

viewDidUnload

언어/Objective - C 2017. 3. 17. 10:06

viewDidUnload 메서드는 Memory Warning Memory Warning 메시지를 시스템에서 현재 활성 중인 프로그램에게 전달하면 iOS delegate 메서드 중에 viewDidUnload 호출하도록 한다.

해당 화면이 다시 그려질 필요가 있을 viewDidLoad메서드가 호출되고 다음이 viewWillAppear 메서드 호출 순으로 가게 된다. 따라서 다시 내용을 불러오려면 viewDidLoad 오버라이딩 해서 처리하면 된다.


viewDidUnload 메서드에서 주로 작성해야 내용은

먼저 First Responder 뷰가 아닌 뷰들과 관계하여 굳이 메모리에 유지 되어야 필요 없는 IBOutlet들을 해제해주면 좋다

)

- (void)viewDidUnload {

self.nameField = nil;

self.numberField = nil;

self.sliderLabel = nil;

self.leftSwitch = nil;

self.rightSwitch = nil;

self.doSomethingButton = nil;

[super viewDidUnload];

}


self.nameField = nil 의미는 [self setNameField:nil] 같은 의미이다. ,


- (void)setNameField:(UITextField *)_param_nameField {

[_param_nameField retain];

[nameField release];

nameField = _param_nameField;

}

이런식으로 세터가 자동으로 구성되어지므로 self.nameField 무사히 nil 할당 받는다.

viewDidLoad 메서드는 nib 파일로부터 해당 뷰들이 모두 메모리에 load 후에 호출되는 메서드이다.

viewDidUnload 기본적으로 UIControlView 관련한 객체들에 대한 메모리 관리를 위한 메서드이지 모든 객체들에 대한 메모리 할당 해제 관리를 책임지기 위한 메서드가 아니다. 오로지 IBOutlet 객체에 대해서만 메모리 관리를 해주는 메서드로 이용하자.

메서드를 마치 iPhone 내에 virtual Memory 제어 하듯이 쓰지 말자. 분명히 여기저기 탈나고 코드가 못생겨진다.


viewDidUnload 메서드에서 객체들을 nil처리 있는 것은 나중에 다시 화면에 그려질 필요가 있을 viewDidLoad에서 이전에 값을 인지할 필요 없이 초기화할 있는 객체들만 가능하다

가장 쉬운 예가 nib파일에 있는 내용으로 메모리 부족으로 warning system call 오면 nib 파일에 해당 내용이 있으므로 간단하게 할당 해제해줘도 나중에 필요시 nib파일에서 다시 로드시키면 된다.


하지만 이전 값을 반드시 기억해야 하는 경우는 따로 디스크에 deep copy 하지 않는한 불러오는 것은 불가능하기 때문에 일률적으로 nil처리 하면 다시 찾아올 방법이 없다.

Posted by 知彼知己百戰不殆
,

delegate

객체간 데이터 통신 시 전달자 역할을 함. 특정 객체에서 발생한 이벤트를 다른 객체에게 통보할 수 있도록 해주는 선언.

가장 많이 쓰이는 곳은 이벤트 처리 시에 가장 많이 활용되고 사용됨.

Posted by 知彼知己百戰不殆
,



StoryBoard에서 빨간색으로 표시한 부분에서 마우스 오른쪽 클릭을 해보면 다음과 같이 나타나는데 여기서 노란색 삼각형으로 표시된 부분을 Delete해주면 된다.


추가:

구글링에서 본 대로 노란색 표시를 모두 지웠음에도 불구하고 계속 같은 오류가 나길래 디버깅 창의 에러 메시지가 상당히 길지만 읽어보았다. 웬만한 에러들은 모두 에러 메시지에 답이 있다는 내 경험하에... 에러 메시지를 보니까 button gogo ~~ 오류가 나길래 아까전에 button gogo라는 변수명을 썼던 적이 있어서 버튼 쪽에서 확인을 해보았다.


지금은 오류 수정을 한다고 해서 지웠지만 빨간색으로 표시한 부분에 gogo라고 쓰여져 있어서 Delete를 하고 다시 빌드 시킨 후 실행해 보았더니 모든 오류가 해결되었다.

Posted by 知彼知己百戰不殆
,