<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      iOS - 從 @property 開始

      核心概念


      本質@property 是一組訪問器方法的聲明 (setter/getter) ,編譯器可以自動“合成”「訪問器」以及「底層存儲(ivar)」,并且允許用點語法調用。

      • 例如:
        @property (nonatomic) NSInteger age;
        
      • 編譯器等價(自動合成):
        {
            NSInteger _age; // 可選的“底層存儲” (backing ivar)
        }
        - (NSInteger)age { return _age; }              // getter
        - (void)setAge:(NSInteger)age { _age = age; }  // setter
        

      好處

      1. 減少樣板代碼
      2. 明確所有權
      3. 性能與并發控制
      4. KVC/KVO 友好
      5. 易讀易維護

      常見屬性修飾符


      • 讀寫性
        • readwrite:可讀可寫(默認)
        • readonly:只讀
      • 原子性
        • atomic:保證“單次訪問器調用”的原子性,速度慢。(默認)
          • 注意:atomic慢,且不保證你“對該對象做的一系列操作”是線程安全的;也不保證順序、事務或對象內部的并發安全,實際場景還是需要顯式同步。
        • nonatomic:不做同步,速度快。
      • 內存語義修飾符
        • strong:持有關系,引用計數+1,新值 retain,舊值 release.
          • 場景:一般對象所有權、父持子
        • weak:不持有,引用計數不變,對象釋放時指針置空。
          • 場景:避免循環引用,如 delegate,子持父、IBOutlet
          • 注意:訪問時可能已經變 nil。
        • copy:生成不可變副本,setter 執行 -(id)copy 方法。
          • 場景:阻止賦值可變對象的后續修改,block入堆。
        • assign:位拷貝,引用計數不變。
          • 場景:用于標量和結構體
          • 注意:對象指針使用 assign 會產生懸垂指針
        • unsafe_unretained:不持有,引用計數不變,對象釋放不會置空。
          • 場景:以往無weak可用時使用的。
      • 其他
        • getter=isEnabled/setter=setFoo:指定自定義 setter/getter。
        • class:類屬性。

      copy相關延伸

      strongcopy修飾的 可變/不可變 對象,對其 賦值/拷貝 會發生什么?

      屬性 -copy -mutableCopy 賦值 NSString 賦值 NSMutableString
      (copy) NSString 淺拷貝 深拷貝 淺拷貝 深拷貝
      (strong) NSString 淺拷貝 深拷貝 淺拷貝 淺拷貝
      (copy) NSMutableString 淺拷貝 深拷貝 淺拷貝 深拷貝
      (strong) NSMutableString 深拷貝 深拷貝 淺拷貝 淺拷貝

      拷貝:

      • -copy一定返回不可變對象
        • 調用對象實際為「不可變類型」,產生淺拷貝。
        • 調用對象實際為「可變類型」,產生深拷貝,得到「不可變類型」的對象。
      • -mutableCopy一定返回可變對象(一定會深拷貝

      賦值:

      • strong修飾的屬性賦值,只會產生淺拷貝,屬性與賦值對象「可變性」一致。
      • copy修飾的屬性賦值,可能深拷貝可能淺拷貝,但是結果一定「不可變」的。
        • 賦值對象是「不可變類型」,產生淺拷貝。
          • 賦值對象是「可變類型」,產生深拷貝,得到「不可變類型」的對象。

      提問:那為什么[(copy)NSMutableString copy]會是淺拷貝?

      • 答案: 基于上述結論,我們可以將答案拆分成 2 步。
        • 賦值:copy修飾的NSMutableString類型屬性,在賦值時會將目標對象“深拷貝”,變為不可變的NSString。因此,我們的屬性self.pStr此時實際指向的是一個NSString(不可變對象)。
        • 拷貝:在對「不可變對象」進行copy操作時,返回“指針級別”的同一對象。
        • 綜上,[(copy)NSMutableString copy]會是一個淺拷貝操作。

      何時存儲(背后存儲backing ivar的規則)

      • 會有存儲
        • 在類的@interface或類擴展里聲明@property。
        • 沒有顯式使用@dynamic,且沒有同時手寫 setter + getter 的。
      • 不會有存儲
        • category里聲明的@property。
        • 使用@dynamic的, 承諾運行時提供訪問器的。
        • 已經實現了 getter + setter 的。
        • 協議@protocol里的@property
        • 類屬性。
      • 例外和細節
        • readonly 若你實現了 getter,則不會再自動合成 ivar
        • “類屬性”沒有ivar實例,通常用static或者其他存儲來實現存儲。
          @interface Config : NSObject
          @property (class, nonatomic, copy) NSString *build;
          @end
          
          @implementation Config
          static NSString *_build;
          + (NSString *)build { return _build; }
          + (void)setBuild:(NSString *)b { _build = [b copy]; }
          @end
          
        • 分類里的屬性如何有“存儲”?
          • 分類里的屬性需要通過關聯對象實現存儲。
          #import <objc/runtime.h>
          @interface UIView (Badge)
          @property (nonatomic, copy) NSString *badgeText; // 分類里不會有 ivar
          @end
          
          @implementation UIView (Badge)
          static const void *kBadgeKey = &kBadgeKey;
          
          - (void)setBadgeText:(NSString *)badgeText {
              objc_setAssociatedObject(self, kBadgeKey, badgeText, OBJC_ASSOCIATION_COPY_NONATOMIC);
          }
          - (NSString *)badgeText {
              return objc_getAssociatedObject(self, kBadgeKey);
          }
          @end
          

      @dynamic@synthesize計算屬性

      • @dynamic

        • 作用:告訴編譯器,不需要生成訪問器和ivar,也不要因為找不到方法而告警。
        • 場景:Core Data 的NSManagedObject子類:
          @interface Book : NSManagedObject
          @property (nonatomic, copy) NSString *title;
          @end
          
          @implementation Book
          @dynamic title; // 訪問器由運行時(Core Data)注入;編譯器不生成也不報缺實現
          @end
          
      • @synthesize

        • 作用:讓編譯器為@property生成 getter/setter 以及背后存儲 ivar,并把屬性名映射到自定義 ivar 名。
      • 計算屬性

        • 作用:不依賴存儲,按需計算。

      propertyivar 的區別

      1. ivar == 純存儲
      2. property == 訪問這個存儲的“方法接口”
      3. 大多數情況使用 self.age,在 init/dealloc/自定義訪問器內部 常用 _age 直接訪問,避免遞歸等問題。
      posted @ 2025-11-04 19:34  齊生  閱讀(4)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 欧美成人精品手机在线| 人妻av无码一区二区三区| 人妻精品久久无码区| 中国熟妇牲交视频| 日韩高清在线亚洲专区国产| 国产精品免费中文字幕| 深夜视频国产在线观看| 国内精品久久久久影视| 又大又长粗又爽又黄少妇毛片| 在线a亚洲v天堂网2018| 亚洲乱理伦片在线观看中字| 金门县| 国产超碰无码最新上传| 日本午夜精品一区二区三区电影| 日本一道高清一区二区三区| 精品精品久久宅男的天堂| 中文字幕乱码一区二区免费| 昭苏县| 久久99精品国产麻豆婷婷| 波多野无码中文字幕av专区| 国产精品一区二区传媒蜜臀| 超清无码一区二区三区| 成年无码av片在线蜜芽| 无码少妇一区二区| 国产激情第一区二区三区| 日夜啪啪一区二区三区| 欧美另类图区清纯亚洲| 福利一区二区1000| 人人澡人摸人人添| 公天天吃我奶躁我的在线观看| 少妇粉嫩小泬喷水视频www| 国产精品视频一区二区不卡| 人人澡人摸人人添| 无套内射视频囯产| 丰满岳乱妇久久久| 丁香婷婷无码不卡在线| 欧美精品一区二区三区中文字幕| 性欧美vr高清极品| 日韩有码中文字幕av| 欧美极品色午夜在线视频| 国产亚洲精品久久久久婷婷图片 |