分析(002)iOSのプロパティ

今日は、単にそれは、プロパティという名前で、当然のことながら、いくつかの単純な強度および他の参考文献がある、OC属性と修飾子を見ました。

一覧どのようないくつかの単純な属性と修飾子。

static int countNum = 1;

@protocol LJLDelegate <NSObject>
-(void)showDelegate;
@end

typedef void(^LJLBlock)(int);

@interface LJLPropertyViewController ()

@property(nonatomic, assign) int num;
@property(nonatomic, assign) double height;
@property(nonatomic, assign) int age;
@property(nonatomic, strong) NSString * str;
@property(nonatomic, copy) NSString * str2;
@property(nonatomic, weak) id <LJLDelegate>delegate;
@property(nonatomic, copy) LJLBlock block;
@property(nonatomic, strong) UIButton * button;
@property(nonatomic, assign, readwrite) BOOL circular;//允许读写

@end

システムが自動的にセットを作成する上記の方法によって作成された属性/方法を取得
実機、arm64を操作します。方法フロントを呼び出しobjc_msgSendが最初に必要なパラメータIDが自己を準備し、SEL、値
   

self.num = 10;
self.height = 1.85;
self.age = 30;
self.str = @"ljl";


 登録は、一般的には0x0〜を0x7店のパラメータに使用される
 パラメータレジスタは、この時間で保存された
 自己のID:0x0の
 0x1の:setNum:
 10:0x2の
    
強い保持と解除操作が下部に自動的に実行しました。そして、それは原子と非原子を区別する修正されたコピーを使用します。
 1、非原性(非アトミック)

基本となる実装で

oldValue = *slot
*slot = newValue;


 2、アトミック(原子)

spinlock_t& slotlock = PropertyLocks[slot];
slotlock.lock();
oldValue = *slot;
*slot = newValue;        
slotlock.unlock();

その後、ロック、
 OLDVALUE =スロット*
 *スロット= newValueに、
 ロック解除
 このロックが唯一の安全セットを保証することができます/取得
 

self.str = @ "ljl123"。

メモリのサイズは、開くために必要なオブジェクトの作成
 オブジェクト16のための最小限のメモリを作成することを。
参考:https://www.bilibili.com/video/av79839999?from=search&seid=7187104079046109220
 NSObjectのからの継承は、その後の成功はまた、オブジェクト(クラスオブジェクト)、オブジェクトとメモリ権の構造、この場所であるというクラスを作成します質問。詳細について最初のレコードは、後に、このような順番に翼を導く神としてより詳細な説明を、見つけて来ます:

@interface LGPerson : NSObject
@property(nonatomic, assign) int num;
@property(nonatomic, assign) double height;
@property(nonatomic, assign) int age;
@end
    
LGPerson *p1 = [LGPerson alloc];
p1.age = 10;
p1.num = 5;
p1.height = 1.8;

(lldb) x/4gx p1
0x600000a899a0: 0x0000000109a79b00 0x0000000a00000005
0x600000a899b0: 0x3ffccccccccccccd 0x0000000000000000

この時以外は、第1の8ビットISAより(オブジェクトの最初の属性は、ISA、隠し属性である)
intは4つの8ビットの二重です。この時間秒8つのプットのint numが、残りの4つの二重の高さに合わせていない、それは第三8を配置します。次は、第8ビットをint INTの背後に配置されています。コード0x0000000a00000005として。10と5。これが私たちのセットの値が含まれています。この場所は、メモリ最適化システム、第二位のバックNUM 5の値にでも言って、次の組み合わせを持つ4つのポイントで、その後、私は非常にこれはメモリアライメントの原則に沿っていないようです理解していないので、疑問があります答えを見つけるために準備ができて答え、最初のレコードを持ちます。
 

@implementation LJLPropertyViewController

struct StructTwo {
    double b;       //8字节  0-7
    int c;          //4字节  8-12  后面补齐 13-15  总大小为16
} MyStruct3;

struct StructTwo1 {
    double b;       //8字节  0-7
    int c;          //4字节  8-12  后面补齐 13-15
    double f;       //8字节  16-23
    int e;          //4字节  24-28  后面补齐 29-31  总大小为32
} MyStruct2;

NSLog(@"%lu---%lu", sizeof(MyStruct3), sizeof(MyStruct2));
16  32

しかしながら、上記構造MyStruct3によって(16)MyStruct2(32)は、この順に、行の構造のためにメモリフットプリントを見て検証します。メモリサイズは、以前の16フィットF後の位置から16-23,11及び16 F開始8-11から8を開始し、C、例えばMyStruct2、0 0-7からBCに(事実に基づいてその位置を決定する属性によって占めそう充填)

 MRC手動メモリ管理
    デリゲート使用ASSIGN
 ARC自動メモリ管理の
    委任使用弱いです
 

修飾子

。1、強い(実質的に同じ効果を維持する)
    強い参照は
    修飾子修飾子デフォルトで
    オブジェクト、+1の参照カウントを保持します。修飾されたオブジェクトは参照カウントで破壊さはゼロです。
 2、弱い
    弱参照の
    参照カウントが増加しない(解放されると元のオブジェクト、元のオブジェクトへの新たなポインタの等価物が放出される)のリリース・アドレス・ポインタのオブジェクトが設定されているときに、オブジェクトの参照カウントは、0でありますゼロ。一般的に参照および変更デリゲートの悪循環を断ち切るために使用されます。
 3割り当てる
    弱参照
    基本データ型およびタイプは一般IDを変更するために使用されている
    オブジェクトを変更したとき。オブジェクトの参照カウントが0の場合、オブジェクトが解放され、それがnilポインタを設定していない、ポインタフィールドが発生します。だから、一般的にyの割り当てを使用してオブジェクトを変更することはできません。
    通常、スタック上に割り当てられた基本データ型は、スタックメモリがシステムによって自動的に処理されているので、ポインタフィールドは発生しません、修正を割り当てることが可能です。
 図4は、コピー
    強い参照
    コピー変更されたオブジェクトは不変です。
    オブジェクトの呼び出しsetメソッドの時にコピーの同等。

@property (nonatomic, copy) NSArray *datas;
NSMutableArray *datas = [NSMutableArray arrayWithObject:@"data"];
self.datas = datas
//相当于 self.datas = [datas copy];

あなたが後ろに件のデータ内のオブジェクトの数を変更した場合でもだから、それはオブジェクトself.datas内部の数には影響しません。
 
 5、アトミック
    アトミック
    デフォルトプロパティ
    を取得/セキュリティ設定を確実にするために、しかし、スレッドの安全性を保証することはできません。そして、パフォーマンスは非アトミック約20倍よりも遅くなります。
    基礎となる実行システム設定/取得する方法がロックされる場合には、このようにして設定は/時間が安全であることを得ることを確実にすることが、全体のオブジェクトは、スレッドセーフであることを保証することはできません。
    イラスト:そうが必要とされているので、この時点で設定さ半分、スレッドBの呼び出しと実行ので、ロックされたスレッドAを実行しているのスレッドAの方法を取得し、そのオブジェクトはそのままスレッドAの取得を取得することです。
    スレッドA・コールが取得する場合は、スレッドBが、Cのスレッドは、すべてのセットを呼び出します。おそらくBも取得することです値は、Cセットの前に、それはの1以上後に設定することができます。
 6は、非アトミックは、
    複数のスレッドによる同時アクセスを可能にする、スレッドの安全性は保証されません。高性能、非アトミック一般的な使用。
 
 図7は、読み書きが
    読み取りおよび書き込み操作を可能にする
    デフォルトモディファイアによって、システムが自動的に設定を生成/方法を得ます。
 8、読み取り専用
    読み取り専用
    システムは、唯一のsetメソッドを生成しませんgetメソッドが生成されます。

ACLStudent.h

@interface ACLStudent : NSObject

@property (nonatomic, assign, readonly) NSInteger studentId;
@property (nonatomic, copy, readonly) NSString *firstName;
@property (nonatomic, copy, readonly) NSString *lastName;
@property (nonatomic, copy, readonly) NSString *lastName;
- (instancetype)initWithStudentId:(NSInteger)studentId firstName:(NSString *)firstName lastName:(NSString *)lastName;
@end

--------------------------
ACLStudent.m
@implementation ACLStudent
- (instancetype)initWithStudentId:(NSInteger)studentId firstName:(NSString *)firstName lastName:(NSString *)lastName {
    self = [super init];
    if (self) {
        _studentId = studentId;
        _firstName = [firstName copy];
        _lastName = [lastName copy];
    }
    return self;
}

ダイレクトコールの場合にfirstNamesetterメソッドstudent.firstName = @"Qiu"は、直接エラーは、そのことを示唆し読み取り専用プロパティの割り当てを宣言することはできません。KVCは、それを使うのか?

[student setValue:@"Qiu" forKey:NSStringFromSelector(@selector(firstName))];

成功はKVCによって変更することができることを見出し、なぜ特定や公式文書を見アクセサ検索の実装の詳細

 9、保持
    他のNSObjectのサブクラスとそのパラメータの古い値を解放し、新しい値を保持します。
    割り当ては値を保持することである着信メッセージをきっかけに指定され保持されます。(I増大は、オブジェクトの参照カウント、オブジェクトの基本的なタイプおよびCore Foundationのない参照カウント保持するように)Objective-Cのオブジェクトのみを使用することができる
コピーとの間の差をと保持し
    、例えば2件のNSString * BとのNSStringの
    コピーは、コピーされ新しいメモリアドレスへの新しいデータ、および別のアドレスにBポイントが、内容は同じです。
    新しいオブジェクトは1を保持保持、古いオブジェクトは変更されません保持されます。別のNSStringの、同一のアドレス(ポインタ、ポインタのコピーを確立する)+保持するオブジェクト。1.後に
    ポインタがコピーされて保持が、コピーのコピーの内容
参照カウント
    同じメモリに、例えば、A、B点を、メモリにA設けられていますメモリが割り当てられ、時間基準カウントに割り当てられた参照カウントは、1 +1をBに割り当てられた参照カウントです。参照カウントが0である場合解放、参照カウントは-1。、メモリを表し、Xは、任意のポインタによって参照されていない場合、システムは直接に解放されることができます。
10、のconst
    変数の修飾子は、読み取り専用です。
    この手段は、パラメータは読み取り専用ことができ、内容を変更することはできません。誰がほぼ修正。
    目的:
    すばやく見つけるために、試験問題を容易にするために、
    大規模アルゴリズムをすばやくモジュールのエラーを見つけることができます

    static NSString * const MB_NET_URL_Dev = @"http://";//开发环境地址
    对于不能修改的数据进行修饰

    NSString * a = @"1234";
    NSString * b = @"5678";
    NSString * c = @"90";

   const NSString * p1 = a;
    p1 = b;
    *p1 = c;//错误  指针指向的地方不能修改

    NSString const *  p2 = a;
    p2 = b;
    *p2 = c;//错误  指针指向的地方不能修改

    NSString * const p3 = a;
    p3 = b;//错误 指针本身不能修改
    *p3 = c;

    const NSString * const p4 = a;
    p4 = b;//错误 指针本身不能修改
    *p4 = c;//错误 指针指向的地方不能修改

11、登録
    に登録します。
    それは優先的に、レジスタにそのような変数のさまざまな動作や操作を、変数を変更し、かつ迅速になります。
    しかし、すべてのアイドルレジスタを超えるユーザーが利用可能なCPUは満たされ、その後場合は、制限または共通メモリ内のスペースを開放する必要があることです。
 12、静的
    静的DAティックSの
    データ領域にスタック領域上の静的変数ではなく、。
    ローカル変数の前に静的なアクションは、この変数の最終値の関数は、この変数の人生を変えて、全体のプロセスの終了を知っているし、この変数の値は唯一、その機能を使用して再割り当てすることができます定義されている、空ではありません。
 13、EXTERN
    AI Xデ外側
    のextern関数がアクションの範囲がグローバルパスは、関数が定義に静的でない延長または修正されるものとする、文書を横切って拡張することができる拡張するために使用することができます。
 

強い参照弱参照

    強いホールド強い参照および他の目的
    弱い、そのような弱参照としてオブジェクトを代入すると、保持していません

    __strong NSObject *obj1=[[NSObject alloc] init];
    __strong NSObject *obj2=obj1;
    __weak NSObject *obj3=obj1;
    NSLog(@"%@,%@",obj1,obj2,obj3);
    obj1=nil;
    NSLog(@"%@,%@",obj1,obj2,obj3);
    //输出 :
    //<NSObject: 0x7fef53708b80>,<NSObject: 0x7fef53708b80><NSObject: 0x7fef53708b80
    //(null),<NSObject: 0x7fef53708b80>,(null)

強いオブジェクトretainCount + 1、弱いではありません。したがって、リリースobjc1 objc2オブジェクトretainCount-1 = 1。objc3がnilであるようにobjc3 retainCountもobjc1 0にリリース、それを、そして後に、メモリの解放を行いました。
 
 アプリケーションの
    2つの異なるオブジェクトは強い参照が循環参照を引き起こす持っているとき、それはお互いを指差しながら、オブジェクトが解放することができない原因になります。-循環参照
    我々は、例えば、循環参照を取り除く必要があるように、場合述べ剤:@property(非アトミック、弱い)ID <デリゲート>デリゲート( MRCに割り当てを使用して)
    ブロックを使用すると、循環参照をもたらすであろう。あなたは、自己保持ブロック、ブロックおよびホールド自己なければなりません

    [self block:^{
        self.value=1;
    }];

    今回は、自己への弱い参照を保持する必要がある、と自己保持ブロックは、ブロックは、使用後にリリースされ、弱参照は、循環参照が発生することはありませんと考えています。ブロックの詳細を再分析した円形の参照メソッドブロックの後ろに他のリフティング。

    __weak typeof(self) weakself=self;
     [self block:^{
         weakself.value=1;
     }];

ただし、次のコードは、循環参照が発生することはありません。深くネストされた場合でも、その後、循環参照が存在します。

    [UIView animateWithDuration:0.2 animations:^{
         self.value=1;
     }];

主に、それらが互いを保持するかどうかを確認するために、循環参照を引き起こしています。
    直接の出口ページならば、現在のVC、VCへのNSTimerの強い参照が現在解放することはできませんので、それはメモリリークが発生しますので、NSTimerは今回、このようNSTimerで現在のViewControllerを有効にすると、現在のオブジェクトへの強い参照になります。退出ページへの最初の必要性の前にNSTimerを破壊します。これは、別の記事で同様の決意で分析NSTimer   インチ
    【無効タイマ];
    タイマ=ゼロ、
 

更新されたコンテンツ属性分析の分析と一部ではないのと同様に、上記の特定は、後にKVCを変更しました。もっと早く相互作用以上の個人プロファイルと理解するためのテスト能力、およびコンテンツのために少しよりも、問題があるだけでなく、神があなたに大きな補正を与えることを願っています。

公開された83元の記事 ウォン称賛12 ビュー180 000 +

おすすめ

転載: blog.csdn.net/shengdaVolleyball/article/details/104698154