SORU
17 Kasım 2013, Pazar


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
17 Kasım 2013, Pazar


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];
}];

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • 3DS Max Tutorials

    3DS Max Tuto

    4 AĞUSTOS 2013
  • ELawshea

    ELawshea

    26 Mayıs 2008
  • Paulo Bautista

    Paulo Bautis

    21 Aralık 2008