Objective-C의 실례 방법, 클래스 방법,Category,Protocol

7408 단어

1. 방법


Objective-C에서는 다음 두 가지 방법이 있습니다.

1.1 실례적인 방법

-으로 시작하는 방법이 실례적인 방법이다.클래스의 인스턴스 객체 중 하나 또는 몇 개에 속합니다. 즉, 클래스 객체가 인스턴스화되어야 사용할 수 있는 방법으로 인스턴스 객체에 메시지를 보냅니다.
// Deck.h

#import 
#import "Card.h"

@interface Deck : NSObject

@property(nonatomic) int cardNum;

//  
- (Card *)randomDrawCard;

+ (NSString *)CardKinds;

@end

인스턴스 방법에서 이 클래스의 모든 인스턴스 변수를 사용할 수 있습니다.
// Deck.m

#import "Card.h"

@implementation Deck

- (Card *)drawCardFromTop
{
    //  
    _cardNum--;

    //TODO.....
}

+ (NSString *)CardKinds
{
    NSLog("Cards are divided into four kinds: spades, diamonds, clubs and hearts");
}

@end 

1.2 유형 방법

+으로 시작하는 방법이 유형이다.Objc의 클래스 방법은 자바의 static 정적 방법과 유사하다. 이것은 클래스 자체에 속하는 방법이고 클래스의 특정한 실례 대상에 속하지 않기 때문에 실례화 클래스가 필요하지 않고 클래스 이름으로 사용할 수 있으며 메시지를 클래스에 보내는 것이다.
// Deck.h

#import 
#import "Card.h"

@interface Deck : NSObject

- (Card *)randomDrawCard;

//  
+ (NSString *)CardKinds;

@end    

클래스 방법에서는 인스턴스 변수를 사용할 수 없습니다.
// Deck.m

#import "Card.h"

@implementation Deck

- (Card *)drawCardFromTop
{
    //  
    _cardNum--;

    //TODO.....
}

//  _carNum
+ (NSString *)CardKinds
{
    NSLog("Cards are divided into four kinds: spades, diamonds, clubs and hearts");
}

@end 

그래서 우리가 사용하는 유형의 방법은 일반적으로 두 가지 상황이 있다.
  • 에서 특수한 형식의 문자열 등 사물을 만듭니다.
  • 을 도구 방법으로 한다. 예를 들어 되돌아오는 상수 등이다.

  • 1.3 유형 방법과 실례 방법 인지의 오점

  • 가지 방법이 메모리에 상주하기 때문에 실례적인 방법보다 효율이 높다.사실상 마운트 시기와 메모리를 차지하는 데 있어 클래스 방법과 실례 방법은 같고 클래스가 처음 사용될 때 마운트 방법은 효율적으로 별 차이가 없다.
  • 가지 방법은 더미에 분배하고 실례적인 방법은 창고에 분배한다.사실상 모든 방법은 창고 구역에 분배될 수 없다. 방법은 2진 코드로 메모리에 저장된 프로그램 코드 구역이고 이 메모리 구역은 쓸 수 없다.이 노트의 개념인 Objective-C의 블록을 보십시오.

  • 1.4 요약


    실례적인 방법과 클래스 방법은 대다수의 공통성이 있다. 예를 들어 하나 이상의 매개 변수가 있을 수 있고 기류를 계승할 수 있는 방법, 같은 성명 규범 등이다.유일하게 다른 것은 클래스 방법이 실례 변수를 사용할 수 없기 때문에 특수한 상황에만 적용된다는 것이다.

    2.Category


    만약 우리가 이미 존재하고 매우 복잡한 종류에 새로운 방법을 추가하고 싶다면 어떻게 해야 합니까?원본을 뒤집어서 추가하시겠습니까?소년아, 너는 너무 천진해, 네가 원본 코드를 볼 수 없으면.설령 우리가 원본 코드를 볼 수 있다 하더라도 만약에 우리가 추가한 논리도 매우 복잡하다면 원시 디자인의 규모를 확대하고 전체 디자인의 구조를 흐트러뜨릴 수 있다.Category는 Objective-C가 제공하는 이 문제를 해결하는 방법입니다.그것은 우리가 존재하는 클래스에 새로운 행위, 즉 방법을 동적으로 추가할 수 있게 한다.클래스를 확장할 때 원본 코드에 접근할 필요도, 하위 클래스를 만들 필요도 없습니다.

    2.1 사용 방법


    Category의 실현은 매우 간단합니다. 예를 들어 설명하겠습니다.
    // Deck.h
    
    #import 
    #import "Card.h"
    
    @interface Deck : NSObject
    
    - (Card *)randomDrawCard;
    
    @end
    

    이것은 클래스 Deck의 성명문건으로 실례적인 방법인 randomDrawCard을 포함한다. 만약에 우리가 원시 클래스를 수정하지 않고 하위 클래스를 추가하지 않는 상황에서 이 클래스에 drawCardFromTop 방법을 추가하려면 두 개의 파일 Deck+DrawCardFromTop.hDeck+DrawCardFromTop.m을 정의하면 된다. 성명문건과 실현문건에서 ()으로Category의 이름을 묶으면 된다. 성명문건은 다음과 같다.
    // Deck+DrawCardFromTop.h
    
    #import "Deck.h"
    #import "Card.h"
    
    @interface Deck(DrawCardFromTop)
    
    - (Card *)drawCardFromTop;
    
    @end
    

    구현 파일은 다음과 같습니다.
    // Deck+DrawCardFromTop.m
    
    #import "Deck+DrawCardFromTop.h"
    #import "Card.h"
    
    @implementation Deck(DrawCardFromTop)
    
    - (Card *)drawCardFromTop
    {
        //TODO.....
    }
    
    @end
    
    DrawCardFromTop은 Category의 이름입니다.여기에는 일반적으로 약정된 습관을 사용해서 성명문서와 실현문서를'원류명+Category명'방식으로 통일적으로 명명한다.또한 간단합니다. Category 선언 파일을 가져온 다음 정상적으로 호출하면 됩니다.
    // main.m
    
    #import "Deck+DrawCardFromTop.h"
    #import "Card.h"
    
    int main(int argc, char * argv[])
    {
    
        Deck *deck = [[Deck alloc] init];
        Card *card = [deck drawCardFromTop];
    
        return 0;
    
    }
    

    2.2 장면 사용

  • 수요 변경은 전체 개발 주기에 흔히 볼 수 있는 일이다. 그러면 우리는 특정한 유형이나 몇 가지 유형에 새로운 방법을 추가하여 수요를 만족시켜야 할 수도 있다.
  • 우리가 팀워크 개발을 할 때 여러 사람이 한 가지 유형의 다른 방법을 실현해야 하는데 이런 상황에서Category를 사용하는 것이 좋은 선택이다.
  • 일부 기초 라이브러리가 우리의 수요를 만족시키지 못할 때 우리는 기초 라이브러리를 확장하고 싶을 때Category가 필요하다.

  • 2.3 주의해야 할 문제

  • Category는 원본 클래스의 인스턴스 변수에 액세스할 수 있지만 변수를 추가할 수는 없습니다. 변수를 추가하려면 상속을 통해 하위 클래스를 생성하는 것이 좋습니다.
  • Category는 원시류를 다시 불러올 수 있는 방법을 추천하지 않지만, 이렇게 하면 다시는 원래의 방법을 방문할 수 없게 된다.다시 불러오려면 하위 클래스를 만드는 것이 좋습니다.
  • 과 일반 인터페이스가 다른 것은 분류된 실현 파일에서 모든 성명을 실현할 필요가 없다는 것이다. 네가 그것을 사용하지 않는다면.

  • 2.4 요약


    Category를 잘 파악하고 사용하면 Objective-C의 동적 특성을 충분히 활용하여 유연하고 간결한 코드를 작성할 수 있다.

    3.Protocol


    간단히 말하면Protocol은 어떤 종류에 속하지 않고, 단지 하나의 방법 목록일 뿐이며, 어떤 종류든지 그 중에서 성명한 방법에 대해 실현할 수 있다.이런 디자인 모델을 일반적으로 대리 모델(delegation)이라고 부른다.프로토콜을 통해 다양한 행위를 정의하고 서로 다른 장면에서 서로 다른 실현 방식을 채택할 수 있다.iOS와 OS X 개발에서 애플은 MVC에서 View와 Controller의 결합을 실현하기 위해 대량의 에이전트 모델을 사용했다.

    3.1 사용 방법


    Protocol에는
  • 은 별도의 성명문건(.h 문건)에서 성명한다.
  • 은 어떤 종류의 성명서에 성명한다.

  • 이러한 두 가지 방법은 구체적인 상황에 따라 결정되지만 코드 규범에 있어서는 모두 일치한다.
    // HandleDeckDelegate.h
    
    @protocol HandleDeckDelegate 
    
    @required
    - (void)ShuffleDeck;
    
    @optional
    - (void)CuttingDeck;
    
    @end
    

    상기 코드에는 두 가지 키워드가 있는데 @required@optional이다. 이 협의를 실현하려면 ShuffleDeck 방법은 반드시 실현해야 하고 CuttingDeck은 선택할 수 있으며 주석을 달지 않으면 방법은 기본적으로 @required이며 반드시 실현해야 한다.
    그러면 이 Protocol을 어떻게 실현합니까? 아주 간단합니다. 일반적인 Objective-C 클래스를 만듭니다. 만약 Protocol이 단독으로 사용한다면.h 파일 성명h 선언 파일에 Protocol을 포함합니다.h 파일, 만약 Protocol이 관련 클래스에 성명된다면, 이 클래스를 도입해야 합니다.h 파일.나중에 이 Protocol을 사용한다고 선언하면 됩니다.
    // Deck.h
    
    #import 
    #import "Card.h"
    #import "HandleDeckDelegate.h"
    
    @interface Deck : NSObject
    
    - (Card *)randomDrawCard;
    
    @end
    

    꺾쇠괄호(<...>)로 묶은 HandleDeckDelegate이 바로 우리가 만든 Protocol입니다.여러 개의 Protocol을 사용하려면 뾰족한 괄호 안에 여러 개의 Protocol 이름을 도입하고 쉼표로 구분하면 된다.예: .
    // Deck.m
    
    #import "Card.h"
    
    @implementation Deck
    
    - (Card *)drawCardFromTop
    {
        //TODO.....
    }
    
    - (void)ShuffleDeck
    {
        //TODO.....
    }
    
    @end
    
    CuttingDeck 방법은 선택 사항이기 때문에 ShuffleDeck을 달성하는 데 그쳤습니다.

    3.2 장면 사용

  • Objective-C의 Protocol과 자바 언어의 인터페이스는 매우 유사하다. 만약에 일부 클래스 간에 계승 관계가 없지만 같은 행위를 한다면 Protocol을 사용하여 그들의 관계를 설명할 수 있다.
  • 의 서로 다른 유형은 같은 Protocol을 준수하고 서로 다른 장면에 서로 다른 실례를 주입하여 서로 다른 기능을 실현할 수 있다.

  • 3.3 주의해야 할 문제

  • 은 약정에 따라 프레임의 접미사가Delegate인 것은Protocol이다. 예를 들어 UIApplicationDelegate10UIWebViewDelegate 등이다.
  • Protocol 자체는 계승할 수 있다. 예를 들어
  • @protocol A
        -(void)methodA;
    @end
    
    @protocol B -(void)methodB;
    @end

    만약 당신이 B를 실현하려고 한다면,methodA와methodB는 모두 실현해야 한다.
  • Protocol은 어떤 종류와도 상관없이 모든 종류가 정의된 Protocol을 실현할 수 있다. 만약에 우리가 특정한 종류가 특정한 Protocol을 실현했는지 알고 싶다면 우리는 conformsToProtocol 방법으로 판단할 수 있다.
  • [obj conformsToProtocol:@protocol(ProcessDataDelegate)] 
    

    3.4 요약


    Protocol에서 가장 자주 사용하는 것은 위탁 대리 모델인데 코코아 프레임워크에서 이런 모델을 대량으로 채택하여 데이터와 UI의 분리를 실현했다.예를 들어 UIView에서 발생하는 모든 이벤트는 Controller에 위임되어 수행됩니다.
    본고의 첫 번째 주소: Objective-C의 실례 방법, 유형 방법,Category,Protocol

    좋은 웹페이지 즐겨찾기