IOS 高級語法與設計模式5(5.1 類目的基本概念與用法)

一 、類目的基本概念
框架

    封裝是面向對象的一個特徵,OC也不例外。可是有的時候咱們會遇到這樣一種狀況,好比封裝一個類,不想再動他了。但是隨着程序的增長,須要在那個類中增長一個小小的方法。這時咱們沒必要再在這個類中作修改,或者定義一個子類。只須要在用到那個方法時,隨手添加一個類目便可。
atom

    1)在類目定義的方法會成爲原始類的一部分,與其餘方法的調用沒有任何區別;
spa

    2)經過給父類定義類目方法,其子類也會繼承這些方法。若是子類添加類目方法,父類不會繼承子類的類目方法。
code

2、類目方法的應用
對象

    1)對現有類進行擴展。好比你能夠擴展Cocoa touch框架中的類,你在類目中增長的方法會被子類所繼承,並且在運行時跟其餘方法沒有區別。
繼承

    2)做爲子類的繼承手段不須要定義一個子類,你能夠經過類目直接給已有類增長方法。
接口

    3)對類中的方法歸類,利用category把一個龐大的類劃分紅小塊來分別進行開發。從而更好的對類進行更新和維護。開發

3、類目方法的侷限性it

    1)沒法向類目中添加新的實例變量。類目沒有位置來容納實例變量。若是想增長類的實例變量,只能經過子類來實現。io

    2)如若,在類目中覆蓋現有類的方法。這樣會引發super的消息斷裂,由於類目中的方法具備更高的優先級。所以,通常不要覆蓋現有類的方法。

4、類目的命名與用法

    類目的命名規則:類名+擴展方法,如"NSString+Revert"

    類目的接口聲明與類的定義方法相似,但類目不繼承父類,只須要帶有一個括號,代表該類的主要用途。

#import <Foundation/Foundataion.h>
//.h 類目的定義
@interface NSString (Revert)
- (void)test;
@end
#import <Foundation/Foundataion.h>
//.m 類的定義
@interface Revert:NSObject 
- (void)test;
@end
#import "NSString+Revert.h"
//.h 類目方法的實現
@implementation NSString (Revert)
- (void)test;
@end
#import "Revert.h"
//.m 類中方法的實現
@implementation NSString (Revert)
- (void)test;
@end

5、相關代碼以下:

//
//  person.h
//  Category
//
//  Created by moki on 14-8-4.
//  Copyright (c) 2014年 Santai. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface person : NSObject
{
@private
    NSString *_name;
    int _age;
}
@property (nonatomic,copy) NSString *name;
@property(nonatomic) int age;

- (void)test;
- (void)eat;
@end

@interface person (creation)
+ (id)personWithName:(NSString *)aName;
+ (id)personWithName:(NSString *)aName withAge:(int)age;
//...
- (id)initWithname:(NSString*)aName;
- (id)initWithname:(NSString *)aName withAge:(int)age;
@end

@interface person (life)
//- (void)eat;
- (void)sleep;
- (void)play;
@end
//
//  person.m
//  Category
//
//  Created by moki on 14-8-4.
//  Copyright (c) 2014年 Santai. All rights reserved.
//

#import "person.h"

@implementation person

@synthesize name=_name;
@synthesize age=_age;
- (void)test
{
    NSLog(@"這是類的一個方法");
}
- (void)eat
{
    NSLog(@"他在吃");
}
@end

@implementation person (creation)

+ (id)personWithName:(NSString *)aName
{
    person *pson = [[person alloc] init];
    pson.name = aName;
    return pson;
    
}
+ (id)personWithName:(NSString *)aName withAge:(int)age
{
    person *pson = [[person alloc] init];
    pson.name = aName;
    pson.age=age;
    return pson;
}

- (id)initWithname:(NSString*)aName
{
    self=[super init];
    if(self)
    {
        self.name=aName;
    }
    return self;
    
}
- (id)initWithname:(NSString *)aName withAge:(int)age
{
    self=[super init];
    if(self)
    {
        self.name=aName;
        self.age=age;
    }
    return self;
    
}

@end

@implementation person (life)
/*- (void)eat
{
    NSLog(@"這是類目的eat方法");
}*/
- (void)sleep
{
    NSLog(@"這是類目的sleep方法");
}
- (void)play
{
    NSLog(@"這是類目的play方法");
}


@end
相關文章
相關標籤/搜索