oc82 成員變數使用copy修飾

2021-09-22 06:28:00 字數 2510 閱讀 8002

//

#import

typedef

void (^myblock)();

@inte***ce

person : nsobject

//@property (nonatomic, retain) nsstring *name;

@property (nonatomic, copy) nsstring *name;

//注意: 如果是block使用copy並不是拷貝, 將pblock所指向的**塊從棧轉移到堆中。block在堆中,使用外界物件的時候,會對外界物件的計數器加1,

@property (nonatomic, copy) myblock pblock;

//@property (nonatomic, retain) myblock pblock;

@end

//

#import

"person.h

"@implementation

person

- (void

)dealloc

@end

//

dog.h

#import

@inte***ce

dog : nsobject

@end

//

dog.m

#import

"dog.h

"@implementation

dog- (void

)dealloc

@end

//

main.m

//copy與string,block的結合使用

#import

#import

"person.h

"#import

"dog.h

"int main(int argc, const

char *ar**) ;

myblock1();

//20

//block預設儲存在棧中, 棧中的block訪問到了外界的物件, 不會對物件進行retain

//block如果在堆中, 如果在block中訪問了外界的物件, 會對外界的物件進行一次retain

person *p2 =[[person alloc] init];

nslog(

@"retaincount = %lu

", [p2 retaincount]);//

1void (^myblock)() = ^;

myblock();

//retaincount = 1

block_copy(myblock); //

將block轉移到堆中

myblock();//

retaincount = 2

//2.可以使用copy儲存block, 這樣可以保住block中使用的外界物件的命

//避免以後呼叫block的時候, 外界的物件已經釋放了

/*__block

*/ dog *d = [[dog alloc] init]; //

1 nslog(@"

dog retaincount = %lu

", [d retaincount]);//

1 person *p3 =[[person alloc] init];

p3.pblock = ^;

nslog(

@"dog retaincount = %lu

", [d retaincount]); //

2

//如果狗在呼叫block之前釋放了, 那麼程式就會崩潰

[d release]; //

1p3.pblock();

[p3 release];

//3.注意點: copy block之後引發迴圈引用。

//如果物件中的block又用到了物件自己, 那麼為了避免記憶體洩露, 應該將物件修飾為__block。

__block person *p = [[person alloc] init]; //

1 p.name = @"

lnj"

; nslog(

@"retaincount = %lu

", [p retaincount]);

p.pblock = ^;

nslog(

@"retaincount = %lu

", [p retaincount]);

p.pblock();

[p release];

//1,p始終是1,無法釋放。

[p release]; //

2breturn0;

}

3的記憶體示意圖

pblock指向的是堆中的**塊位址。

oc82 成員變數使用copy修飾

import typedef void myblock inte ce person nsobject property nonatomic,retain nsstring name property nonatomic,copy nsstring name 注意 如果是block使用copy並不是...

012 成員變數和區域性變數

一 成員變數和區域性變數的區別?a 在類中的位置不同 成員變數 在類中方法外 區域性變數 在方法定義中或者方法宣告上 b 在記憶體中的位置不同 成員變數 在堆記憶體 區域性變數 在棧記憶體 c 生命週期不同 成員變數 隨著物件的建立而存在,隨著物件的消失而消失 區域性變數 隨著方法的呼叫而存在,隨著...

07 01成員變數和區域性變數的區別

成員變數和區域性變數的區別?a 在類中的位置不同 成員變數 在類中方法外 區域性變數 在方法定義中或者方法宣告上 b 在記憶體中的位置不同 成員變數 在堆記憶體 區域性變數 在棧記憶體 c 生命週期不同 成員變數 隨著物件的建立而存在,隨著物件的消失而消失 區域性變數 隨著方法的呼叫而存在,隨著方法...