Objective-C의 실례 방법, 클래스 방법,Category,Protocol
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
그래서 우리가 사용하는 유형의 방법은 일반적으로 두 가지 상황이 있다.
// 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
// 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 유형 방법과 실례 방법 인지의 오점
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.h
과 Deck+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 장면 사용
// Deck.h
#import
#import "Card.h"
@interface Deck : NSObject
- (Card *)randomDrawCard;
@end
// 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
// 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.3 주의해야 할 문제
2.4 요약
Category를 잘 파악하고 사용하면 Objective-C의 동적 특성을 충분히 활용하여 유연하고 간결한 코드를 작성할 수 있다.
3.Protocol
간단히 말하면Protocol은 어떤 종류에 속하지 않고, 단지 하나의 방법 목록일 뿐이며, 어떤 종류든지 그 중에서 성명한 방법에 대해 실현할 수 있다.이런 디자인 모델을 일반적으로 대리 모델(delegation)이라고 부른다.프로토콜을 통해 다양한 행위를 정의하고 서로 다른 장면에서 서로 다른 실현 방식을 채택할 수 있다.iOS와 OS X 개발에서 애플은 MVC에서 View와 Controller의 결합을 실현하기 위해 대량의 에이전트 모델을 사용했다.
3.1 사용 방법
Protocol에는
이러한 두 가지 방법은 구체적인 상황에 따라 결정되지만 코드 규범에 있어서는 모두 일치한다.
// 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 장면 사용
3.3 주의해야 할 문제
UIApplicationDelegate
10UIWebViewDelegate
등이다.@protocol A
-(void)methodA;
@end
@protocol B -(void)methodB;
@end
만약 당신이 B를 실현하려고 한다면,methodA와methodB는 모두 실현해야 한다.
conformsToProtocol
방법으로 판단할 수 있다. [obj conformsToProtocol:@protocol(ProcessDataDelegate)]
3.4 요약
Protocol에서 가장 자주 사용하는 것은 위탁 대리 모델인데 코코아 프레임워크에서 이런 모델을 대량으로 채택하여 데이터와 UI의 분리를 실현했다.예를 들어 UIView에서 발생하는 모든 이벤트는 Controller에 위임되어 수행됩니다.
본고의 첫 번째 주소: Objective-C의 실례 방법, 유형 방법,Category,Protocol
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.