Objective-C基礎(chǔ)整理

  1. Objective-C變量前面加"_"是什么意思?
    • 聲明的property如果沒(méi)有指定synthesize犀忱,就會(huì)自動(dòng)聲明_開頭的實(shí)例變量。
    • 假如你聲明了一個(gè)@property(nonatomic, copy) NSString *name;通過(guò)_name進(jìn)行存取不會(huì)調(diào)用setter/getter方法,聲明的copy也不會(huì)起作用褪储,self.name會(huì)調(diào)用setter/getter方法蟀架,copy起作用瓣赂。
    • @synthesize name = name;就不會(huì)生成_name片拍,取而代之的是name煌集。
  2. @property內(nèi)存管理策略
    • 非ARC

      1. copy:只用于NSString/block。
      2. retain:除NSString/block以外的OC對(duì)象捌省。
      3. assign:基本數(shù)據(jù)類型苫纤、枚舉、結(jié)構(gòu)體(非OC對(duì)象),當(dāng)2個(gè)對(duì)象相互引用卷拘, 一端用retain喊废,一端用assign。
    • ARC

      1. copy:只用于NSString/block栗弟。
      2. strong:用于除NSString/block以外的對(duì)象污筷。
      3. weak:當(dāng)兩個(gè)對(duì)象互相飲用,一端用strong乍赫,一端用weak瓣蛀。
      4. assign:基本數(shù)據(jù)類型、枚舉雷厂、結(jié)構(gòu)體(非OC對(duì)象)惋增。
  3. copy/mutableCopy
  • 利用原對(duì)象產(chǎn)生一個(gè)副本對(duì)象(副本對(duì)象中的內(nèi)容和原對(duì)象內(nèi)容一致),修改原對(duì)象的屬性和行為不會(huì)影響副本對(duì)象改鲫,修改副本對(duì)象不會(huì)影響原對(duì)象诈皿。
  • 一般情況下copy/mutableCopy操作會(huì)生成一個(gè)新的對(duì)象,但是不可變對(duì)象通過(guò)copy不會(huì)生成新對(duì)象钩杰。
    - 產(chǎn)生新對(duì)象的原因
    1. 修改原對(duì)象不會(huì)影響副本對(duì)象纫塌,修改副本對(duì)象不會(huì)影響原對(duì)象。
    2. 不可變對(duì)象通過(guò)mutableCopy生成可變對(duì)象讲弄,所以必須生成新對(duì)象(可變對(duì)象通過(guò)copy生成不可變對(duì)象同理)措左。
    3. 可變對(duì)象通過(guò)mutableCopy生成可變對(duì)象,當(dāng)修改原/副本對(duì)象的時(shí)候不能相互影響所以要生成新對(duì)象避除。
    4. 不可變對(duì)象通過(guò)copy生成不可變對(duì)象怎披,因?yàn)閮蓚€(gè)對(duì)象是都不能修改的,所以不會(huì)生成新對(duì)象(oc的內(nèi)存優(yōu)化)瓶摆。
    • 正因?yàn)閏opy有時(shí)會(huì)生成新對(duì)象凉逛,有時(shí)不會(huì)生成新對(duì)象,所以就出現(xiàn)了淺拷貝與深拷貝
      • 淺拷貝:沒(méi)有生成新對(duì)象群井,本質(zhì)就是指針拷貝状飞。
        • 注意:原對(duì)象引用計(jì)數(shù)+1(相當(dāng)于進(jìn)行retain操作)。
      • 深拷貝:生成新對(duì)象书斜,本質(zhì)就是創(chuàng)建了一個(gè)新對(duì)象诬辈。
        • 注意:原對(duì)象引用計(jì)數(shù)不變。
  • 如果想令自己的類支持拷貝操作就要實(shí)現(xiàn)NSCopying或NSMutableCopying協(xié)議荐吉。如果自定義的對(duì)象分為可變和不可變兩個(gè)版本焙糟,就要同時(shí)實(shí)現(xiàn)NSCopying和NSMutableCopying協(xié)議。
    • NSCopying協(xié)議中只有一個(gè)方法(生成不可變對(duì)象)

      - (id)copyWithZone:(nullable NSZone *)zone;
      

      實(shí)現(xiàn):

      //Person.h
      @property (nonatomic, assign) int age;
      @property (nonatomic, copy) NSString *name;
      
      //Person.m
      - (id)copyWithZone:(NSZone *)zone
      {
          // 1.創(chuàng)建一個(gè)新的對(duì)象
          Person *p = [[[self class] allocWithZone:zone] init];
          // 2.設(shè)置當(dāng)前對(duì)象的內(nèi)容給新的對(duì)象
          p.age = _age;
          p.name = _name;
          // 3.返回新的對(duì)象
          return p;
      }
      
    • NSMutableCopying協(xié)議中只有一個(gè)方法(生成可變對(duì)象)

      - (id)mutableCopyWithZone:(nullable NSZone *)zone;
      

      實(shí)現(xiàn):

      //Person.h
      @property (nonatomic, assign) int age;
      @property (nonatomic, copy) NSString *name;
      
      //Person.m
      - (id)mutableCopyWithZone:(NSZone *)zone
      {
          // 1.創(chuàng)建一個(gè)新的對(duì)象
          Person *p = [[[self class] allocWithZone:zone] init];
          // 2.設(shè)置當(dāng)前對(duì)象的內(nèi)容給新的對(duì)象
          p.age = _age;
          p.name = _name;
          // 3.返回新的對(duì)象
          return p;
      }
      
    • 舉例

      [NSArray mutableCopy] -> NSMutableArray
      [NSMutableArray copy] -> NSArray
      
    • 淺拷貝:只拷貝容器對(duì)象本身样屠,而不復(fù)制其中的數(shù)據(jù)穿撮。

      //Person.h
      @property (nonatomic, assign) int age;
      @property (nonatomic, copy) NSString *name;
      
      //Person.m
      - (id)copyWithZone:(NSZone *)zone
      {
          // 1.創(chuàng)建一個(gè)新的對(duì)象
          Person *p = self;
          // 2.返回新的對(duì)象
          return p;
      }
      
    • 深拷貝:在拷貝對(duì)象自身的時(shí)候缺脉,將底層數(shù)據(jù)也復(fù)制過(guò)去。

      //Person.h
      @property (nonatomic, assign) int age;
      @property (nonatomic, copy) NSString *name;
      
      //Person.m
      - (id)deepCopy
      {
          // 1.創(chuàng)建一個(gè)新的對(duì)象
          Person *p = [[[self class] allocWithZone:zone] init];
          // 2.設(shè)置當(dāng)前對(duì)象的內(nèi)容給新的對(duì)象
          p.age = _age;
          p.name = _name;
          // 3.返回新的對(duì)象
          return p;
      }
      
      屏幕快照 2016-07-31 上午11.39.37.png
    • 復(fù)制對(duì)象的時(shí)候一般執(zhí)行淺拷貝悦穿。

    • 如果你的對(duì)象需要深拷貝攻礼,應(yīng)該考慮專門執(zhí)行深拷貝的方法。

    • 字符串屬性都要使用copy咧党。(防止外界修改內(nèi)部數(shù)據(jù))

    • 使用copy保存block秘蛔,這樣可以保住block中使用的外界對(duì)象,避免以后調(diào)用block的時(shí)候傍衡,對(duì)象已經(jīng)被外界釋放深员。(Block_release(blcok),MRC中使用蛙埂,釋放block倦畅,并且block中的對(duì)象也可以接收到release消息)

      • 注意:copy block之后會(huì)產(chǎn)生循環(huán)引用(對(duì)象中的block又用到了對(duì)象自己),為了避免內(nèi)存泄漏應(yīng)該講對(duì)象修飾為__block.
    • 子類會(huì)繼承父類的協(xié)議绣的,當(dāng)父類實(shí)現(xiàn)了copy的方法叠赐,子類也就相應(yīng)的實(shí)現(xiàn)了。但是如果子類有新的屬性屡江,那么必須在子類中重寫copyWithZone方法, 在該方法中先調(diào)用父類創(chuàng)建副本設(shè)置值, 然后再設(shè)置子類特有的值芭概。

      • 舉例(Son為上文中Person的子類)
      Son.h
      @property (nonatomic, assign) double height;
      Son.m
        - (id)copyWithZone:(NSZone *)zone
      {
          // 1.創(chuàng)建一個(gè)新的對(duì)象
          id obj = [super copyWithZone:zone];
          // 2.設(shè)置新對(duì)象的數(shù)據(jù)
          [obj setHeight:_height];
          // 3.返回新對(duì)象
          return obj;
      }
        ```
      
  1. 集合((可變)數(shù)組、(可變)字典惩嘉、NSSet)對(duì)象的內(nèi)存管理:

    • 將一個(gè)對(duì)象添加到一個(gè)集合中罢洲,集合會(huì)對(duì)對(duì)象進(jìn)行一次retain操作(引用計(jì)數(shù)加一)。
    • 當(dāng)集合釋放對(duì)象之后會(huì)給集合中所有的對(duì)象發(fā)送release消息(引用計(jì)數(shù)減一)文黎。
    • 當(dāng)集合移除一個(gè)對(duì)象之后惹苗,會(huì)給這個(gè)對(duì)象發(fā)送release消息(引用計(jì)數(shù)減一)。
  2. block默認(rèn)存儲(chǔ)在棧中耸峭,棧中的block訪問(wèn)外界對(duì)象桩蓉,不會(huì)對(duì)外界對(duì)象進(jìn)行retian操作。如果block在堆中劳闹,并且訪問(wèn)了外界對(duì)象院究,就會(huì)對(duì)外界對(duì)象進(jìn)行一次retain操作。

    //將block轉(zhuǎn)移到堆中
    Block_copy(block);
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末本涕,一起剝皮案震驚了整個(gè)濱河市儡首,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌偏友,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件对供,死亡現(xiàn)場(chǎng)離奇詭異位他,居然都是意外死亡氛濒,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門鹅髓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舞竿,“玉大人,你說(shuō)我怎么就攤上這事窿冯∑保” “怎么了?”我有些...
    開封第一講書人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵醒串,是天一觀的道長(zhǎng)执桌。 經(jīng)常有香客問(wèn)我,道長(zhǎng)芜赌,這世上最難降的妖魔是什么仰挣? 我笑而不...
    開封第一講書人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮缠沈,結(jié)果婚禮上膘壶,老公的妹妹穿的比我還像新娘。我一直安慰自己洲愤,他們只是感情好颓芭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著柬赐,像睡著了一般亡问。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上躺率,一...
    開封第一講書人閱讀 51,182評(píng)論 1 299
  • 那天玛界,我揣著相機(jī)與錄音,去河邊找鬼悼吱。 笑死慎框,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的后添。 我是一名探鬼主播笨枯,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼遇西!你這毒婦竟也來(lái)了馅精?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤粱檀,失蹤者是張志新(化名)和其女友劉穎洲敢,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體茄蚯,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡压彭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年睦优,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片壮不。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡汗盘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出询一,到底是詐尸還是另有隱情隐孽,我是刑警寧澤,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布健蕊,位于F島的核電站菱阵,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏绊诲。R本人自食惡果不足惜送粱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望掂之。 院中可真熱鬧抗俄,春花似錦、人聲如沸世舰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)跟压。三九已至胰蝠,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震蒋,已是汗流浹背茸塞。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留查剖,地道東北人钾虐。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像笋庄,于是被迫代替她去往敵國(guó)和親效扫。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 為什么很多內(nèi)置類如UITableView的delegate屬性都是assign而不是retain? 所有的引用計(jì)數(shù)...
    煙雨平生花飛舞閱讀 1,193評(píng)論 0 3
  • 本文為轉(zhuǎn)載: 作者:zyydeveloper 鏈接:http://www.reibang.com/p/5f776a...
    Buddha_like閱讀 873評(píng)論 0 2
  • 每個(gè)人都應(yīng)該有自己人生的三條線直砂。 下面我介妱下三條線的意義 第一條線是基線菌仁,就是認(rèn)清自己是誰(shuí),掌握了那些知識(shí)静暂,具有...
    奔向自由的路上閱讀 1,326評(píng)論 0 2
  • 2016 谷歌開發(fā)者大會(huì) 12月8日济丘,在北京國(guó)家會(huì)議中心(奧林匹克公園),一場(chǎng)谷歌技術(shù)狂歡洽蛀,剛參加完闪盔,感覺很贊弯院,簡(jiǎn)...
    sugaryaruan閱讀 496評(píng)論 0 0
  • 這是我在校園網(wǎng)上看到曾經(jīng)一位學(xué)姐留詩(shī),感覺很美泪掀。但是后來(lái)又特意咨詢了學(xué)中文的,說(shuō)颂碘,對(duì)仗不工整blabla... 但...
    司徒小歪閱讀 526評(píng)論 0 1