属性カテゴリを追加

 

インタビューの質問

  1. カテゴリー原則の実現、そしてなぜのみカテゴリープラスメソッドはプロパティを追加することはできません。
  2. カテゴリーがあり、負荷の方法は?loadメソッドが呼び出されると?loadメソッドは、それを継承することができますか?
  3. 注文荷重は、違いを初期化し、そして呼び出しは、時間のカテゴリにそれらを書き換えます。

公式ドキュメント

You use categories to define additional methods of an existing class—even one whose source code is unavailable to you—without subclassing. You typically use a category to add methods to an existing class, such as one defined in the Cocoa frameworks. The added methods are inherited by subclasses and are indistinguishable at runtime from the original methods of the class. You can also use categories of your own classes to:
1.Distribute the implementation of your own classes into separate source files—for example, you could group the methods of a large class into several categories and put each category in a different file.
2.Declare private methods.
You add methods to a class by declaring them in an interface file under a category name and defining them in an implementation file under the same name. The category name indicates that the methods are an extension to a class declared elsewhere, not a new class.

翻訳:

あなたは何のソースコードが存在しない場合でも、使用方法のサブクラスではない、追加の従来の方法のクラス定義クラスを使用することができます。クラス分類は、一般的に、既存のクラスココアフレームに添加する方法で定義されたものとして、使用されています。あなたはまた、クラスに独自のクラスを使用することができ区別できないのクラスで、実行時にサブクラスによって継承されたメソッド、およびオリジナルのメソッドを追加します。

  1. それらの別のソースファイルを達成するために、分散型クラスは、例えば、方法は、複数のカテゴリと異なるカテゴリに各ファイルの大きなクラスに分類することができます。

  2. プライベートメソッドを宣言します。

そして、同じファイル名の定義方法を達成するために、クラス宣言メソッドにインターフェース・クラス名によってファイルに追加することができます。カテゴリ名は、これらのメソッドは、他の場所でクラス宣言ではなく、新しいクラスで拡張されていることを示しています。詳細については、以下を参照してくださいの公式ドキュメントのカテゴリを

分類します

新しい人クラスの属性名を追加します。

    //Person.h
    @interface Person : NSObject
    @property (nonatomic , strong) NSString * name;
    @end
    //Person.m
    @implementation Person

    @end

人+の試験区分の確立は、年齢がプロパティを宣言します

    @interface Person (test)
    @property (nonatomic , assign) int  age;
    @end

利用可能年齢の分類プロパティかどうかを確認するために、オブジェクトの2つのインスタンスを作成します。

    Person *person1 = [[Person alloc]init];
    person1.name  = @"person1";
    person1.age = 10;

    Person *person2 = [[Person alloc]init];
    person2.name  = @"person2";
    person2.age = 60;

    NSLog(@"person1的name:%@ age:%d",person1.name,person1.age);
    NSLog(@"person2的name:%@ age:%d",person2.name,person2.age);

あなたが実行することができたときに表示するには、このステップを行い-[Person setAge:]: unrecognized selector sent to instance 0x600000db88d0、間違ったアラームを。年齢で、我々の人+のテストは、実際に発生する、または名前の一貫性のない者と財産の元のクラスではありません。私たちは、元のクラスで宣言名は、実際に私たちは、プロパティ宣言、setterメソッドとgetterメソッドを生成支援するシステムであることを知っています。したがって、我々は、プロパティの分類を宣言し、これらの3つのメソッドを試すために、独自の分類プロパティを追加する効果を取ることができます。

    #import "Person.h"
    @interface Person()
    {
        NSString *_name;
    }
    @end
    @implementation Person
    - (void)setName:(NSString *)name{
        _name = name;
    }
    - (NSString *)name{
        return _name;
    }
    @end
    #import "Person+test.h"
    static NSInteger age1 = 0;
    @implementation Person (test)
    - (void)setAge:(NSInteger)age{
        age1 = age;
    }
    - (NSInteger)age{
        return age1;
    }
    @end

印刷情報

    person1的name:person1 age:60
    person2的name:person2 age:60

印刷は情報化時代の値は最後のものだけが保存されて見ることができます。このように、同じメモリ空間を占有するように、我々は、元の値を保持することはできません。これらは分類が、あなたは属性を追加するには分類された4つの方法についてお話し、プロパティを直接追加することはできませんについて説明します。

プロパティを追加するには、次の4つの方法の分類

最初:(お勧めしますが、結果を達成していません)

店舗変数、辞書に格納されている各値に対して1に辞書を通じ、オブジェクトはキーと値の欠点の真値として自己によって行われます。各プロパティを追加して、辞書の必要性があった、辞書には、拡大を続ける、分類辞書これは、負荷のメソッドを作成することです。

#import "Person+test.h"
static NSMutableDictionary *dict;
@implementation Person (test)
+(void)load{
    dict = [NSMutableDictionary dictionary];
}
- (void)setAge:(NSInteger)age{
    [dict setObject:[NSString stringWithFormat:@"%ld",age] forKey:[NSString stringWithFormat:@"%@",self]];
}
- (NSInteger)age{

    return [[dict objectForKey:[NSString stringWithFormat:@"%@",self]] integerValue];
}
@end

第2の共通:()

#import "Person+test.h"
#import <objc/runtime.h>
static NSString * agekey = @"agekey";
@implementation Person (test)

- (void)setAge:(NSInteger)age{
    objc_setAssociatedObject(self, &agekey, @(age), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)age{

    return [objc_getAssociatedObject(self, &agekey) integerValue];
}

@end

第3の共通:()

#import "Person+test.h"
#import <objc/runtime.h>
@implementation Person (test)
- (void)setAge:(NSInteger)age{
    objc_setAssociatedObject(self, &("age"), @(age), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)age{

    return [objc_getAssociatedObject(self, &("age")) integerValue];
}
@end

第四:(強くお勧めします)

推奨される理由:すべてのメソッドは、体系的なアプローチを促した、セッター/ゲッターストアIDの矛盾が発生しません。ハンド文字列問題。

#import "Person+test.h"
#import <objc/runtime.h>
@implementation Person (test)
- (void)setAge:(NSInteger)age{
    objc_setAssociatedObject(self, @selector(age), @(age), OBJC_ASSOCIATION_ASSIGN);
}
- (NSInteger)age{

    return [objc_getAssociatedObject(self, _cmd) integerValue];
}
@end

おすすめ

転載: www.cnblogs.com/lovemargin/p/11936033.html