NSNotification 예제

최상위뷰가 있다.

최상위 뷰에서 부모뷰를 띄웠다. 

부모뷰에서 자식 뷰를 띄웠다.

 

이때, 자식뷰를 닫을때 부모뷰까지 같이 닫아 줘야하는 요구사항이 있다. 이럴때는 NSNotification 을 사용한다.

 

먼저 부모뷰에 NSNotification 설정과 콜백메소드(편의상 이렇게 부르겠다)를 작성해준다.

viewdidload{

    //노티피케이션 등록 - 자식창을 닫을때 이곳(부모)도 닫히게 노티 등록

    [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(closeViewControllerBySelf:)

        name:@"close"

      object:nil];

}

이렇게 셋팅을 해주고 호출될 메소드를 작성해준다.

//자식창 닫힐때 부모창도 같이 닫히게

-(void) closeViewControllerBySelf:(NSNotification *) notification{

    NSLog(@"부모창이 콜되었습니다.");

    NSString *message = [notification.userInfo objectForKey:@"message"];

    NSLog(@"자식창에서 던져준 메시지 :  %@", message); //취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다

    //화면닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //부모창 닫기 성공

    }];

}

이제 자식 뷰 로직을 보자.

//닫기 버튼 눌렀을때!

- (IBAction)cancelAction:(id)sender {    

    //창 닫기

    [self dismissViewControllerAnimated:YES completion:^{

        //창이 닫힐때 작성을 해주어야 한다. 위에 작성하면 이 창을 호출한 부모창은 닫히지 않는다.

        NSDictionary *userInfo = @{ @"message": @"취소팝업 뷰 컨트롤러에서 던진 확인용 메시지입니다." };

        [[NSNotificationCenter defaultCenter] postNotificationName:@"close"

                                        object:nil

                                        userInfo:userInfo];

        // [[self view] removeFromSuperview];

    }];

}

 

자식뷰에서 창이 닫힐때 NSNotificationCenter를 이용해서 postNotificationName에해당 이름을넣고 창을 닫아주면,부모창의 NSNotificationCenter메소드가 호출된다

참고:http://seorenn.blogspot.com/2014/05/cocoa-nsnotification.html

objective c nsoperation 예제

 개념정리

 

 #.

 NSOperation =.  하나의 작업 단위.

 NSOperation 모델링 상태, 우선순위, 의존성, 관리를 지원하는 추상 클래스이다.

 NSOperation 상속하여 커스텀 클래스를 만들어 활용함.

 

 #.

 네트워크 요청, 이미지 리사이즈, 텍스트 처리, 또는 기타 다양한 반복처리등을 처리하는 NSOperation 있을때,

  특정 작업이 담겨있는 NSOperation 객체는 혼자서 일을 없다.

 이러한 작업을 진행해주는 녀석이 NSOperationQueue이다.

 

 #.

 NSOperationQueue : NSOperationQueue 작업의 동시 실행을 조절

 기본적으로는 First-In-First-Out으로 동작

 maxConcurrentOperationCount 프로퍼티로 특정시간 동안 동시에 실행 가능한 작업의 숫자를 정함.

 

 

 - 스레드를 이용하여 병렬처리하기 3가지 방법

 1. GCD

 2. NSThread

 3. NSOperationQueue

 


 -NSOperationQueue 이용해서 병렬처리 하기 순서

 

1.새로운 NSOperationQueue 작성

2.작성한 operationQueue 병렬로 실행하고 싶은 처리(operation) 넣기



 1.작업간 의존성 부여해서 특정 작업이 끝난 수행할 특정 작업 추가  : addDependency

   제거 : removeDependency

 

 )

 MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

 MyCalcOperation *calcOperation = [[MyCalcOperation alloc]init];

 [mylengthOperation addDependency:calcOperation];

 

 

 2. setCompletionBlock 메소드로 block 등록하면 작업이 완료된 후에 block 수행

 

 )

 MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

 [mylengthOperation setCompletionBlock:^{

     NSLog(@"Complete");

     }] ;

 [mylengthOperation start];

 

 

 3. UI작업은 mainThread에서 처리

 

 )

     NSOperationQueue *mainQueue = [NSOperationQueue mainQueue];

         [mainQueue addOperationWithBlock:^{

         // UI 갱신은 메인쓰레드에서!

         [self.tableView reloadData];

         [[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:NO];

         }];

 


 예제



 


//

//  ViewController.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "ViewController.h"

#import "MyLengthOperation.h"

#import "MyCalcOperation.h"


@interface ViewController (){

@private

NSOperationQueue    *queue;

}

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

   

    MyLengthOperation *mylengthOperation = [[MyLengthOperation alloc]init];

    mylengthOperation.queuePriority = NSOperationQueuePriorityHigh;

    

    

     MyCalcOperation *calcOperation = [[MyCalcOperation alloc]init];

     calcOperation.queuePriority = NSOperationQueuePriorityHigh;

    


    if(queue == nil){

        queue = [[NSOperationQueue alloc]init];

        [queue setMaxConcurrentOperationCount:5];

         NSLog(@" !NSOperationQueue가 없어서 생성했습니다!!!!!");

    }else{

         NSLog(@"  NSOperationQueue가 있어요!!!!!");

    }

    

    [queue addOperation:mylengthOperation];

    [queue addOperation:calcOperation];

    

    

     //[mylengthOperation addDependency:calcOperation];

     //[mylengthOperation cancel];


}



- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}



@end





//

//  MyLengthOperation.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "MyLengthOperation.h"


@implementation MyLengthOperation


- (void)main

{

    

    NSLog(@"MyLengthOperation  #############################");

    for (int i = 0; i < 1000; i++) {

        if ( self.isCancelled ) {

            break;

        }

        NSLog(@"%f  #####################", sqrt(i));

    }

}



@end


//

//  MyCalcOperation.m

//  NSOperationQ

//

//  Created by 위피아 on 26/11/2018.

//  Copyright © 2018 위피아. All rights reserved.

//


#import "MyCalcOperation.h"


@implementation MyCalcOperation



- (void)main

{

    

    NSLog(@"MyCalcOperation ***************************");

    for (int i = 0; i < 1000; i++) {

        if ( self.isCancelled ) {

            break;

        }

        NSLog(@"%f   ***************************", sqrt(i));

    }

}



@end




  1. 2018.11.27 17:12

    비밀댓글입니다

ios objective c 코어오디오 다루기 1



오디오 파일을 불러와서 속성 정보를 출력하는 간단한 로직이다.

코어오디오 api를 사용하기 위해서 AudioToolbox 라이브러리를 추가해줘야한다.

(왼쪽 네비게이션에서 프로젝트 아이콘 클릭 -> Build Phasses -> Link Binary With Libraries -> + 버튼 클릭 -> 찾아서 추가해줌)


//

//  main.m

//  1

//

//  Created by service on 2018. 11. 6..

//  Copyright © 2018년 service. All rights reserved.

//

/*

 파일을 열고,

 메타데이터에 대한 버퍼 할당

 메타데이터를 갖는다.

 */

#import <Foundation/Foundation.h>

#import <AudioToolbox/AudioToolbox.h>

//파일경로 : "~/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/test_cbr.mp3"

//editschema 를열고 위의 파일 경로를 인자로 넣어준다.

//첫번째 문자열 : 실행파일의 이름, 두번째 문자열: 오디오 파일의 경로

int main(int argc, const char * argv[]) {

    


    @autoreleasepool {

        //오디오 파일의 경로 확인

        if (argc < 2) {

            printf("usage: CAMetadata /full/path/to/audiofile\n");

            return -1;

        }

        

        //경로가 있다면 여러가지 애플의 프레임워크에서 사용하는 nsstring 으로 변환.홈디렉토리의 단축형인 틸드 문자를 ~/music/ 같이 수용

        NSString *audioFilePath = [[NSString stringWithUTF8String:argv[1]] stringByExpandingTildeInPath];

        

        //오디오 파일 api는 파일 경로의 url 표현으로 동작한다.

        NSURL *audioURL =  [NSURL fileURLWithPath:audioFilePath];

        

        NSLog(@"audioURL - 경로 : %@" , audioURL);

      

        //코어 오디오는 오디오 파일 객체를 참조하는 audioFileID형식을 사용하기때문에 지역변수 선언

        AudioFileID audioFile;

        //코어 오디오 함수는 ossstatus형인 반환 값을 통해서 성공,실패전달. noErr(0값)을 제외한 다른 상태는 오류

        OSStatus theErr = noErr;

        

        //첫번째 코어오디오 함수: CFURLRef , 파일권한 플래그, 파일형식 힌트, AudioFileID의 포인터를 인자로 받는다.

        theErr = AudioFileOpenURL((__bridge CFURLRef)audioURL, kAudioFileReadPermission, 0, &audioFile);

        NSLog(@"theErr - 값 : %d" , (int)theErr);    //0

        //오류나면 종료

        assert(theErr == noErr);

        

        

        //파일의 메타데이터를 얻기위해서 kAudioFilePropertyInfoDictionary호출 할것이다.

        //사전에 반환되는 메타데이터를 위한 메모리를 할당할 지역변수 선언

        UInt32 dictionarySize = 0;

        //필요한 크기를 얻기위해 audiofileid, 속성, 결과를 받을 포인터, 속성이 쓰기 가능한 여부를 나타내는 플래그 변수를 전달.

        theErr = AudioFileGetPropertyInfo(audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, 0);

        assert(theErr == noErr);

        

        

        CFDictionaryRef dictionary;

        //속성을 요청할 준비가 됨.

        theErr = AudioFileGetProperty(audioFile, kAudioFilePropertyInfoDictionary, &dictionarySize, &dictionary);

        assert(theErr == noErr);

        

        

        NSLog(@"dictionary 값출력 : %@", dictionary);

        CFRelease(dictionary);

        theErr = AudioFileClose(audioFile);

        assert(theErr == noErr);

        

        

        /*

         출력내용:

         2018-11-06 10:35:46.640373+0900 1[703:115853]

            audioURL - 경로 : file:///Users/service/Music/iTunes/iTunes%20Media/Music/Unknown%20Artist/Unknown%20Album/test_cbr.mp3

         2018-11-06 10:35:46.641179+0900 1[703:115853]

            dictionary 값출력 : {

                "approximate duration in seconds" = "52.86";

            }

         

         

         */

        

    }

    

    

    

    

    

    

    return 0;

}

objective c 기초


=============== 반환값, 파라미터가 객체일때 표기법

  • 반환값, 파라미터가 객체 : 클래스 이름과 * 을 사용한다.

    - (NSString *)uppercaseString;

  • 구조체: * 없이 사용

    - (NSRange)rangeOfString:(NSString *)aString; 


=============== 객체 생성하기


#import <Foundation/Foundation.h>


int main(int argc, const char * argv[]) {

   @autoreleasepool {

      

      NSObject *obj1 = [[NSObject alloc] init]; // 반환값이 객체이기 때문에 *변수 사용.

      NSLog(@"Object : %@", obj1);

      

              NSObject *obj2 = obj1;

      NSLog(@"Obj2 : %@", obj2);


   }

    return 0;

}


=============== 지역변수 전역변수

ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@property (nonatomic,strong) NSString *name;


@end


ViewController.m

#import "ViewController.h"


@interface ViewController ()


@property(nonatomic, strong) NSString *vehicle;


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    NSLog(@"이름: %@" , self.name);

    

    self.name = @"anna";

    

    NSLog(@"이름: %@" , self.name);

    

    _name = @"bob";

    

    NSLog(@"이름: %@" , _name);

    

    [self setName:@"cant"];

    

    NSLog(@"이름: %@", [self name]);

    

}


출력

ObjectiveCAlert[1414:212708] 이름: (null)

2018-07-28 10:51:53.207975+0900 ObjectiveCAlert[1414:212708] 이름: anna

2018-07-28 10:51:53.208148+0900 ObjectiveCAlert[1414:212708] 이름: bob

2018-07-28 10:51:53.208421+0900 ObjectiveCAlert[1414:212708] 이름: cant


======================= 지역변수 전역변수

Person.h

#import <Foundation/Foundation.h>


@interface Person : NSObject

{

    //지역변수라서 같은 클래스 안에서 만 접근가능하다.

    BOOL isInsecure;

}


//전역변수라서 어디에서든 접근가능하다.

@property (nonatomic,strong) NSString *firstName;

@property (nonatomic,strong) NSString *lastName;


//전역메서드 - 이곳에 작성안해주면 viewcontroller 즉 다른 클래스에서 접근할 수 없다.!

-(void)test;



@end



Person.m

#import "Person.h"


@implementation Person


-(void)test{

    

    self.firstName = @"bob";

    

    _firstName = @"jack";

    

    isInsecure = YES; //지역변수라서 접근가능

    

    [self setLastName: @"davis"];

    

    NSString *name = [self firstName];

    NSString *nicname = [self lastName];

    

    NSLog(@"이름: %@ - 닉네임: %@",name,nicname); //이름: jack - 닉네임: davis

}


@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end

ViewController.m

#import "ViewController.h"

#import "Person.h" //import 해준다!

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    Person *person1 = [[Person alloc]init]; //객체 생성 및 초기화


    person1.firstName = @"kang"; //변수 할당


    [person1 setLastName:@"gil dong"]; // 변수할당

    

    //person1.isInsecure = NO; 지역변수라서 다른 클래스에서 접근 불가능

    

    //NSLog(@"%@", person1.firstName); //kang

    //NSLog(@"%@", person1.lastName); //gil dong

   

    [person1 test]; //이름: jack - 닉네임: davis


}


@end


======================= setter getter 활용법


Vehicle.h

#import <Foundation/Foundation.h>


@interface Vehicle : NSObject


@property (nonatomic) long odomater;


@property (nonatomic,strong) NSString *model; //포인터 변수


@end


Vehicle.m

#import "Vehicle.h"


@implementation Vehicle


//셋터구현 - 불필요한 값을 검증하기 위해 사용되는 예

-(void)setOdomater:(long)odomater{

    if(odomater > _odomater){ //원래 값이 입력한 값 보다 크면

        _odomater = odomater;

    }

}


-(NSString *)model{

    if([_model isEqualToString:@"honda"]){

        return @"oh no~~~";

    }else{

        return _model; //입력한 값

    }

}


@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end


ViewController.m

#import "ViewController.h"

#import "Vehicle.h"

@interface ViewController ()

@end


@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];


    Vehicle *car = [[Vehicle alloc]init];

    

    //section1

    /*

    car.odomater = -100;

    NSLog(@"odometer: %lu", car.odomater); //0

    

    car.model = @"honda";

    NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 oh no~~~ 를 운전합니다.

     */

    

    //section2

    car.odomater = 100;

    NSLog(@"odometer: %lu", car.odomater); //100

    

    car.model = @"ferari";

    NSLog(@"나는 %@ 를 운전합니다." , car.model); //나는 ferari 를 운전합니다.

}

@end



======================= NSString

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    NSString *firstName = @"John";

    NSString *allocatedString = [[NSString alloc]init];

    

    NSLog(@"name: %@", firstName); //name: John

    

    NSString *fullName = [NSString stringWithFormat:@" %@ smith %@",firstName , @"Charles the III"];

    

    NSString *display = [fullName stringByAppendingString: @" - Died 1448"];

    

    NSLog(@"fullName: %@", fullName); //fullName:  John smith Charles the III

    

    NSLog(@"display: %@", display); //display:  John smith Charles the III - Died 1448

   

    

    

    NSString *var1 = @"Junk";

    NSString *var2 = @"in the trunk";

    NSString *var3 = @"junk";

    

    if(![var1 isEqualToString:var2]){

        NSLog(@"var1 과 var2 는 같지 않습니다."); //var1 과 var2 는 같지 않습니다.

    }

    

    if([var1.lowercaseString isEqualToString: var3]){

        NSLog(@"var1 과 var3은 같습니다. -1"); //var1 과 var3은 같습니다. -1

    }

    

    if([var1 caseInsensitiveCompare:var3] == NSOrderedSame){

        NSLog(@"var1 과 var3은 같습니다. -2" ); //var1 과 var3은 같습니다. -2

    }

    

    

    

    //초기화

    //NSString *str = [[NSString alloc]initWithString:@"This is NSString"];


    //간소하게

    NSString *str = @"This is NSString";

    NSLog(@"str : %@",str); //This is NSString

    

    //immutable class - 변경 불가

    NSString *result;


    result = [str substringFromIndex:6]; //6번째 문자열 이후의 문자열 출력 NSString

    result = [str substringToIndex:3]; // 앞에서 3번째 문자열 까지 출력 Thi

    

    result = [[str substringToIndex:11]substringFromIndex:8];   // NSS

    result = [[str substringFromIndex:8] substringToIndex:3];   // NSS

    

    result = [[str substringWithRange:NSMakeRange(8, 3)] lowercaseString];  //nss

    

    NSLog(@"result : %@", result);

    


    //mutable - 변경가능

    NSMutableString *mstr = [NSMutableString stringWithFormat: str];

    [mstr appendString: @" and NSMutableString"];

    [mstr insertString:@"Mutable " atIndex:8];

    NSLog(@"mstr : %@", mstr); //his is Mutable NSString and NSMutableString


    

}



@end


======================= NSNumber

#import "ViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    int imAnIn = 5;

    float iAmFloat = 3.3;

    double iAmTheDouble = 5.666664;

    

    NSLog(@"Int: %d", imAnIn);

    NSLog(@"iAmFloat: %f", iAmFloat);

    NSLog(@"iAmTheDouble: %f", iAmTheDouble);

    

    //NSNumber 초기화

    NSNumber *numInt = [NSNumber numberWithInt:5];

    NSNumber *numInt2 = [NSNumber numberWithInt:6];

    

    //int로 형변환

    int val = numInt.intValue;

    int val2 = numInt2.intValue;

    

    int sum = val + val2;

    

    NSLog(@"sum : %d",sum);

    

    //NSNumber로 형변환

    NSNumber *numSum = [NSNumber numberWithInt:sum];

    

    //배열에 담기

    NSArray *arr = @[numInt, numInt2, numSum];


    //numSum을 스트링 타입으로 변환

    NSString *str = numSum.stringValue;

    

    

    NSInteger someInt = 55;

    

    //오류

   //NSNumber *sumNum = [numInt intValue] * [numInt2 intValue];

    NSNumber *sumNum = [NSNumber numberWithInt:(numInt.intValue) * (numInt2.intValue)];

    NSLog(@"sumNum : %@",sumNum); //30

    

}


@end



======================= 클래스 메서드, 인스턴스 메서드



person.h

#import <Foundation/Foundation.h>


@interface Person : NSObject


- (void)speakName;

+ (void)stateSpecies;



@end


person.m

#import "Person.h"


@implementation Person



- (void)speakName{

    NSLog(@"my name is jack!");

}


+ (void)stateSpecies{

    NSLog(@"i am a human");

}



@end


ViewController.h

#import <UIKit/UIKit.h>


@interface ViewController : UIViewController


@end


ViewController.m

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    Person *person =[[Person alloc]init];

    

    [person speakName];         //인스턴스 메서드 (-) my name is jack!


    [Person stateSpecies];     //클래스 메서드 (+) i am a human

    

}


@end



======================= 메서드 체인 (예) - 위에 코드와 아래 4줄 코드는 같다.



======================= swift를 objective c로 변환해보기



#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@property (nonatomic) double bankAccount;

@property (nonatomic) double itemAmount;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    self.bankAccount =  500.0;

    self.itemAmount = 400.0;

    

    //실행

    [self playground];

    //살 수 있음!

    //player b wins!

}


//구입가능여부 체크

- (BOOL) canPurchase: (double) amount {

    if(self.bankAccount >= amount){

        return YES;

    }

    return NO;

}



//우승자 선정 함수

- (void) declareWinnerWithPlayerAScore:(NSInteger)scoreA playerBScore:(NSInteger)scoreB{

    if(scoreA > scoreB){

        NSLog(@"player a wins!");

    }else if(scoreB > scoreA){

         NSLog(@"player b wins!");

    }else{

         NSLog(@"again");

    }

}



//실행 함수

- (void) playground{

    //구입 여부 함수 호출

    if([self canPurchase:self.itemAmount]){

        NSLog(@"살 수 있음!");

    }

    

    //우승자 선정 함수 호출

    [self declareWinnerWithPlayerAScore:55 playerBScore:66];

    

}



@end




======================= 고정배열, 가변 배열

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    NSArray *arr = [NSArray arrayWithObjects:@"my", @"mother", @"told", @"me", nil];

    NSArray *arr2 = @[@"donkey",@"kong" , @"ate", @"your", @"mom"];

    NSString *str = [arr objectAtIndex:2];

    NSLog(@"str : %@",str); //str : told

    

    arr = @[@"mario" , @"hahahoho"]; //재할당;

    NSLog(@"arr num %li", arr.count); //2

    

    // 가변 배열 ---------------------------------------

    

    NSMutableArray *mut = [NSMutableArray arrayWithObjects:@"boom",@"jam",@"slam",@"pam", nil];

    NSLog(@"mut: %@", mut.debugDescription);

    /*

     (

     boom,

     jam,

     slam,

     pam

     )

     */

    

    //삭제

    [mut removeObjectAtIndex:2];

    //삽입

    [mut addObject: @"beast master"];

    

    NSLog(@"mut 2: %@", mut.debugDescription);

    /*(

    boom,

    jam,

    pam,

    beast master

    )*/

    

    NSArray *arr3 = [NSArray arrayWithArray:arr];

    NSArray *arr4 = mut;

    

    //NSMutableArray *arr4 = arr; 오류

    

    //

    NSArray *frutie = [[NSArray alloc]initWithObjects:@"apple",@"banana", @"pineapple", @"lemon", nil];


    /* for 문 예제 1

     for (int i = 0; i< [frutie count]; i++){

     NSLog(@"frute : %@", [frutie objectAtIndex:i]);

     }

     */


    //for 문 예제2

    for (NSString *strTemp in frutie) {

        NSLog(@"과일1 : %@" , strTemp);

    }

    


    //가변 array

    //할당

    NSMutableArray *ffrute = [NSMutableArray arrayWithArray:frutie];

    

    [ffrute addObject:@"tomato"];

    [ffrute addObject:@"wotermelon"];

    [ffrute addObject:@"mango"];

    

    for (NSString *strTemp in ffrute){

        NSLog(@"과일2 : %@", strTemp);

    }


}


@end



======================= 딕셔너리

#import "ViewController.h"

#import "Person.h"

@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    

    //dictionary

    NSDictionary *dic = [[NSDictionary alloc]initWithObjectsAndKeys:@"강", @"이름", @"20", @"나이", nil];

    

    NSLog(@"name : %@" , [dic objectForKey:@"이름"]);

    NSLog(@"age : %@" , [dic objectForKey:@"나이"]);

    

    //가변 dictionary

    NSMutableDictionary *mdic = [NSMutableDictionary dictionaryWithDictionary:dic];

    

    [mdic setObject:@"한국" forKey:@"사는곳"];

    [mdic setObject:@"까무잡잡" forKey:@"얼굴색"];

    NSLog(@"location : %@" , [mdic objectForKey:@"사는곳"]);

    NSLog(@"face color : %@" , [mdic objectForKey:@"얼굴색"]);

    

    //-----------------------------------------------------------------------------

    

    

    NSNumber *age = [NSNumber numberWithInt:40];

    NSNumber *age2 = [NSNumber numberWithInt:34];

    

    NSDictionary *dic1 = @{@"jack":age, @"jon:":age2};

    NSDictionary *dic2 = [[NSDictionary alloc]init];

    

    int jacksAge = [[dic1 objectForKey: @"jack"] intValue];

    

    NSNumber *age3 = [dic1 objectForKey:@"jack"];

    int jacksAge2 = [age3 intValue];

    

    

    NSLog(@"jacks age : %d",jacksAge); //jacks age : 40


    NSMutableDictionary *mut = [@{@"1":@"bmv",@"2":@"volvo",@"3":@"ugly"} mutableCopy];

    NSLog(@"%@",mut);

    /*

     {

     1 = bmv;

     2 = volvo;

     3 = ugly;

     }

     */

    

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

    

    [mut2 setObject:@"an object" forKey:@"a key"];

    [mut2 setObject:[NSNumber numberWithDouble:20.000] forKey:@"doubletrouble"];

    

    NSLog(@"%@",mut2);

    /*

     {

     "a key" = "an object";

     doubletrouble = 20;

     }

     */

}




@end


======================= 객체지향 예 1

Vehicle.h

#import <Foundation/Foundation.h>


@interface Vehicle : NSObject

//부모 프로 퍼티

@property (nonatomic,strong) NSString *make;

@property (nonatomic,strong) NSString *model;

@property (nonatomic,strong) NSString *engineSize;

-(void)drive;

@end


Vehicle.m

#import "Vehicle.h"


@implementation Vehicle


//부모 메소드

-(void)drive{

    NSLog(@"i am driving");

}


@end


Civic.h

#import "Vehicle.h"


//Vehicle 의 서브 클래스

@interface Civic : Vehicle


-(void)test;

@end



Civic.m

#import "Civic.h"


@implementation Civic


//초기화

- (id)init

{

    if( self = [super init]){

    

    }

    

    //자신의 drive 호출

    [self drive];

    return self;

}


//여기에만 적어주면 이 클래스 안에서만 호출 가능. Civic.h에 적어주면 다른 클래스에서도 호출 가능!!!!

-(void) test{

    self.make = @"honda";

    self.model = @"civic";

}



-(void) drive {

    NSLog(@"drive from subclass");

    //부모 drive 호출

    [super drive];

}


@end



ViewController.m

#import "ViewController.h"

#import "Civic.h"

@interface ViewController ()

@property(nonatomic,strong) NSString *iAmPrivate;

@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];


    //객체생성

    Civic *civic = [[Civic alloc]init];

    

    

    // 호출 안해주면 밑에 nslog는 둘다 nil.., Civic.h에 구현 안해주면 이곳에서 호출 불가능..

    [civic test];

    

    //[civic drive];

    NSString *model = [civic model];

    NSString *make = [civic make];

    

    NSLog(@"make :  %@ " ,make); //make :  honda

    NSLog(@"model :  %@ " ,model); //model :  civic


}

@end








'ios 뽀개기 > objective-c' 카테고리의 다른 글

UIViewContorller의 수명주기 관리 메서드  (0) 2018.10.23
iOS 파일 시스템 관련 함수들 (NSFileManager Class)  (3) 2018.10.23
objective c 의 모든것  (5) 2018.07.28
objective c alert 구현  (0) 2018.07.28
객체지향 예제  (0) 2018.07.10
array dictionary  (0) 2018.07.10
  1. 2018.09.10 10:52

    비밀댓글입니다

  2. 2018.09.10 16:10

    비밀댓글입니다

  3. 2018.09.28 14:50

    비밀댓글입니다

  4. 2018.10.05 08:48

    비밀댓글입니다

  5. 2018.10.11 17:01

    비밀댓글입니다

+ Recent posts