//#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
//3的記憶體示意圖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;
}
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 生命週期不同 成員變數 隨著物件的建立而存在,隨著物件的消失而消失 區域性變數 隨著方法的呼叫而存在,隨著方法...