Generic typeof for weak self references

26,802

Solution 1

This works!

__typeof__(o) __weak

Which I've defined in my BBlock project as BBlockWeakSelf which can be used like this:

BBlockWeakSelf wself = self;

https://github.com/kgn/BBlock/blob/master/BBlock.h

Edited based on Aleph7's response.

Solution 2

In the latest clang version Apple clang version 4.0 (tags/Apple/clang-421.1.48) (based on LLVM 3.1svn), i.e. Xcode 4.4+, the __typeof__((__typeof__(self))self) trick is not necessary anymore. The __weak typeof(self) bself = self; line will compile just fine.

Solution 3

The correct way to do this is

__weak ActualClassName* weakSelf = self;

Macros only make it unclear what the variable actually is, and what you're actually doing with it, in addition to adding non-portable meta-language to your code.

If you need a more generic version of the class than ActualClassName provides, you aren't dealing with self anymore, since where self is defined, so is the class of self defined.

In those cases, you should use the closest base class name in your inheritance tree, NSObject or better, never id, e.g.

__weak MyBaseClassName* weakObject = object;

Solution 4

Generic Weakself Reference (No Import Required + Snippet)


In my experience, the way to go is to use:

__typeof__(self) __weak weakSelf = self;

Note how the ownership qualifier belongs in front of the actual variable.

It's very apparent what's happening when it is used and it can be made into a handy code snippet in Xcode which makes it even easier to use in any project or class where this is needed. (I use "ws" as the snippet's completion shortcut)

Hmm.. I need a weak reference here..

ws{return}

Done. No need to ever include a header in future projects for this, just use the snippet.


Xcode Snippet


Title: Generic Weak Self Reference
Platform: All
Language: Objective-C
Completion Shortcut: ws
Completion Scopes: Function or Method
Code: __typeof__(self) __weak weakSelf = self;


Edit: Added note about ownership qualifier position based on comments, and Xcode Snippet Info

Solution 5

i think use this to be ok:

__weak __typeof(&*self)weakSelf = self;

it reference AFNetworking's AFURLConnectionOperation.m codes.

Share:
26,802
keegan3d
Author by

keegan3d

Updated on August 02, 2020

Comments

  • keegan3d
    keegan3d over 3 years

    I am trying to figure out a way to use typeof to create a weak reference to self for use in blocks to avoid retain cycles.

    When I first read about this it seems that the convention was to use __block typeof(self) bself = self;, which compiles but using __block to avoid retain cycles doesn't work anymore and __weak should be used instead.

    However __weak typeof(self) bself = self; results in an error:

    The type 'typeof (self)' (aka 'TUAccountsViewController *const __strong') already has retainment attributes set on it

    Is there a way to use typeof or another call to generically create a weak reference to self?