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.拖動乙個按鈕到...