Reputation: 22939
I have a block wherein I use self
so I declare a weak reference to self:
__weak MyClass *weakSelf = self;
Now my questions:
I get an error where I define weakSelf
and I don't understand what this should mean.:
weak attribute can not be specified on an automatic variable
Inside my block I pass weakSelf
to another block and I am not sure if I now have to do the same thing again like so:
__weak MyClass *weakWeakSelf = weakSelf;
And then pass weakWeakSelf
to that block?
Upvotes: 6
Views: 2784
Reputation: 6084
With libextobjc it will be readable and easy:
- (void)doStuff
{
@weakify(self);
// __weak __typeof__(self) self_weak_ = self;
[self doSomeAsyncStuff:^{
@strongify(self);
// __strong __typeof__(self) self = self_weak_;
// now you don't run the risk of self being deallocated
// whilst doing stuff inside this block
// But there's a chance that self was already deallocated, so
// you could want to check if self == nil
[self doSomeAwesomeStuff];
[self doSomeOtherAsyncStuff:^{
@strongify(self);
// __strong __typeof__(self) self = self_weak_;
// now you don't run the risk of self being deallocated
// whilst doing stuff inside this block
// Again, there's a chance that self was already deallocated, so
// you could want to check if self == nil
[self doSomeAwesomeStuff];
}];
}];
}
Upvotes: 1
Reputation: 22962
With ARC
__weak __typeof__(self) wself = self;
Wihtout ARC
__unsafe_unretained __typeof__(self) wself = self;
Upvotes: 3
Reputation: 38728
This is most likely occurring as you are targeting down to iOS 4. You should change it to be
__unsafe_unretained MyClass *weakWeakSelf = weakSelf;
Upvotes: 8