Her zaman YAY bloğu içine kendini zayıf referans pass?
Ben biraz karıştırdı blok kullanımı Objective-C kullanmak şu anda ARC ve ben oldukça çok engeller benim app, şu anda her zaman yönlendirme self
yerine onun zayıf referans. Bu blok self
istinat ve dealloced olmaktan tutma neden olabilir ? Soru, her zaman bir blok self
weak
başvuru kullanmalıyım ?
-(void)handleNewerData:(NSArray *)arr
{
ProcessOperation *operation =
[[ProcessOperation alloc] initWithDataToProcess:arr
completion:^(NSMutableArray *rows) {
dispatch_async(dispatch_get_main_queue(), ^{
[self updateFeed:arr rows:rows];
});
}];
[dataProcessQueue addOperation:operation];
}
ProcessOperation.h
@interface ProcessOperation : NSOperation
{
NSMutableArray *dataArr;
NSMutableArray *rowHeightsArr;
void (^callback)(NSMutableArray *rows);
}
ProcessOperation.m
-(id)initWithDataToProcess:(NSArray *)data completion:(void (^)(NSMutableArray *rows))cb{
if(self =[super init]){
dataArr = [NSMutableArray arrayWithArray:data];
rowHeightsArr = [NSMutableArray new];
callback = cb;
}
return self;
}
- (void)main {
@autoreleasepool {
...
callback(rowHeightsArr);
}
}
CEVAP
Tartışma strong
weak
parçası odaklanmak için yardımcı olur. Bunun yerine odaklanmakdöngüsübölüm.
Bir de korurdöngüsüNesne Nesne B . korur Bir zaman olur bir döngüveB nesne ya da nesne serbest ise bu durumda Nesne A. korur:
- Nesne B Nesne için bir başvuru içerir çünkü ayırmanın olmayacak.
- Ama Nesne B hiç Bir Nesne için bir başvuru olduğu sürece ayırmanın olmayacak.
- Ama asla Bir Nesne B Nesne için bir başvuru içerir çünkü kaldırıldı.
- ebediyen
Böylece, bu iki nesne sadece eğer her şey düzgün çalışıyor olsaydı, ayırmanın olmalılar olsa ömrü boyunca program hafızasında askıda.
Merak ettik ne kadar, korumakdöngüleribu döngüler oluşturmak ve kendi blokları ile ilgili bir şey yok. Bu, örneğin: bir sorun değil
[myArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
[self doSomethingWithObject:obj];
}];
Blok self
ama self
blok korumaz korur. Eğer bir ya da diğer serbest bırakılırsa, hiç bir döngü oluşturulur ve her şey olması gerektiği gibi kaldırıldı alır.
Başına dert almak gibi bir şey
//In the interface:
@property (strong) void(^myBlock)(id obj, NSUInteger idx, BOOL *stop);
//In the implementation:
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[self doSomethingWithObj:obj];
}];
Şimdi, nesne (**20) blok strong
açık bir referans vardır. Ve bloğu varörtülüself
güçlü referans. Bu bir döngü, ve şimdi de nesne düzgün kaldırıldı.
Böyle bir durumda, self
çünkütanımı gereğizaten blok strong
bir başvuru var, genelde en kolay engellemek için self
açıkça zayıf bir başvuru yaparak gidermek için:
__weak MyObject *weakSelf = self;
[self setMyBlock:^(id obj, NSUInteger idx, BOOL *stop) {
[weakSelf doSomethingWithObj:obj];
}];
Ama bu seni takip varsayılan desen olmamalıblokları ile uğraşırken o self
çağrı! Bu sadece başka bir öz ve blok arasındaki döngüsü korumak olacağını kırmak için kullanılır. Eğer bu desen her yerde kabul edersen, self
ayırmanın sonra idam şey için bir blok geçme riski vardır.
//SUSPICIOUS EXAMPLE:
__weak MyObject *weakSelf = self;
[[SomeOtherObject alloc] initWithCompletion:^{
//By the time this gets called, "weakSelf" might be nil because it's not retained!
[weakSelf doSomething];
}];
Nasıl fotoğraf kullanıcılar görünüm iç...
Nasıl bağımlılıkları enjekte etmek içi...
Yumuşak bir referans ve Java zayıf bir...
Java: güçlü/yumuşak/zayıf/hayalet refe...
JavaScript bir referans ile ya da pass...