oc中copy的簡單使用以及注意事項

2021-09-10 06:48:47 字數 4332 閱讀 4778

copy修飾字串,可以防止外界修改內部的資料

@inte***ce

student

: nsobject

@property

(nonatomic, strong) nsstring * name;

@end

nsmutablestring *temp =

[[nsmutablestring alloc]initwithformat:@"lwl"];

student *stu =

[[student alloc]init]

; stu.name = temp;];

nslog

(@"name = %@"

,stu.name)

;

首先我們建立了乙個student類,並宣告了乙個name屬性,修飾符為strong。在**二中,定義了乙個變數temp可變字串,並建立了stu例項。把temp字串賦值給stu中的name屬性。最後temp字串追加@「test」,最後列印出來的stu的name也會追加test;

2019-01

-2714:

50:25.484899

+0800 copyuserproperty[

8486

:938202

] hello, world!

2019-01

-2714:

50:25.485079

+0800 copyuserproperty[

8486

:938202

] name = lwl test

program ended with exit code:

0

**解決辦法**
只需要將student中的name屬性修飾的strong變成copy即可

@inte***ce

student

: nsobject

@property

(nonatomic, copy) nsstring * name;

@end

2019-01

-2715:

12:39.131612

+0800 copyuserproperty[

9016

:1066999

] hello, world!

2019-01

-2715:

12:39.131878

+0800 copyuserproperty[

9016

:1066999

] name = lwl

program ended with exit code:

0

**分析原因**
如果修飾符為strong,在將temp賦值給stu的name的時候,temp指向的物件會在引用計數(retaincount)會加1,相單于兩個變數同時指向了同乙個物件,修改其中乙個另外乙個肯定會變換。如果修飾符為copy,在將temp賦值給stu的name的時候,會重新拷貝乙個物件放在堆中,temp指向的物件的引用計數(retaincount)不會加1,temp和stu的name指向不同的物件。是深拷貝。

block預設儲存在棧中,棧中的block訪問到外界的物件時,不會進行相應的retain操作;如果block在堆中(block_copy巨集可以將block轉移到堆中),在訪問外界的物件時,會進行相應的retain操作。

student *stu =

[[student alloc]init]

;nslog

(@"retaincount = %lu"

,[stu retaincount]);

void

(^myblock)

(int)=^

(int age)

;myblock(3

);block_copy

(myblock)

;nslog

(@"retaincount = %lu"

,[stu retaincount]

);

student類新增block屬性

typedef void

(^myblock)

(void);

@inte***ce

student

: nsobject

@property

(nonatomic, assign) myblock pblock;

@property

(nonatomic, copy) nsstring * name;

@end

dog *d =

[[dog alloc]init]

; student *stu =

[[student alloc]init]

; stu.pblock =^;

[d release]

;

stu.

pblock()

;[stu release]

;

在stu物件中的block中訪問到d物件,因為block修飾的屬性是assgin,block儲存在棧中,所以對d物件的引用計數(retaincount)不會加1,d物件釋放之後,stu對用了block就會訪問到殭屍物件,導致程式崩潰。

**解決方法**
typedef void

(^myblock)

(void);

@inte***ce

student

: nsobject

*注意:如果是block使用copy並不是拷貝,而是轉移*

@property

(nonatomic, copy) myblock pblock;

@property

(nonatomic, copy) nsstring * name;

@end

將block修飾符變為copy的時候,block會被轉移到堆中,會對其引用的物件增加引用計數。

2019-01

-2715:

51:57.716059

+0800 copyuserproperty[

10115

:1259494

] d =

0x1005168e0

>

2019-01

-2715:

51:57.716220

+0800 copyuserproperty[

10115

:1259494]-

[student dealloc]

program ended with exit code:

0

上面的**中student物件可以釋放,但dog物件沒有釋放。

**解除方法**

只需要在block使用的物件前面加上__block修飾

__block dog *d =

[[dog alloc]init]

;

student *stu =

[[student alloc]init]

;stu.pblock =^;

[d release]

;

stu.

pblock()

;[stu release]

;

2019-01

-2716:

04:59.728277

+0800 copyuserproperty[

10441

:1288724]-

[dog dealloc]

2019-01

-2716:

04:59.728615

+0800 copyuserproperty[

10441

:1288724

] d =

0x100682b30

>

2019-01

-2716:

04:59.728632

+0800 copyuserproperty[

10441

:1288724]-

[student dealloc]

program ended with exit code:

0

xilinx FPGA IOB約束使用以及注意事項

在xilinx fpga中,iob是位於io附近的暫存器,是fpga上距離io最近的暫存器,同時位置固定。當你輸入或者輸出採用了iob約束,那麼就可以保證從io到達暫存器或者從暫存器到達io之間的走線延遲最短,同時由於io的位置是固定的,即存在於io附近,所以每一次編譯都不會造成輸入或者輸出的時序發...

mysql記憶體使用以及優化中需要的幾點注意

1 從記憶體中讀取資料是微秒級別的。而從磁碟讀則是毫秒級別的。二者相差乙個數量級。所以想優化資料庫,第乙個要做到的就是優化io。2 key buffer size global 設定的記憶體區域大小快取了myisam表的索引。由於myisam只快取索引在記憶體中,並不快取資料在記憶體,所以如果記憶體...

CMFCColorButton的使用以及重繪

cmfccolorbutton是visual studio 2008 sp1版本以上提供的顏色採集器。系統環境 windows 7 程式設計環境 visual studio 2008 sp1 下面介紹下使用步驟 1.新建基於對話方塊的工程,名稱為mycolorbuttondemo 2.拖動乙個按鈕到...