Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Objective-C: @class Directive before @interface?

What is the difference between these two class declarations? I don't understand why @class is utilized here. Thanks.

@class TestClass;  @interface TestClass: UIView {     UIImage *image1;     UIImage *image2; } 

and

@interface TestClass: UIView {     UIImage *image1;     UIImage *image2; } 
like image 898
Ryan Avatar asked Apr 04 '12 22:04

Ryan


2 Answers

@class exists to break circular dependencies. Say you have classes A and B.

@interface A:NSObject - (B*)calculateMyBNess; @end  @interface B:NSObject - (A*)calculateMyANess; @end 

Chicken; meet Egg. This can never compile because A's interface depends on B being defined and vice-versa.

Thus, it can be fixed by using @class:

@class B; @interface A:NSObject - (B*)calculateMyBNess; @end  @interface B:NSObject - (A*)calculateMyANess; @end 

@class effectively tells the compiler that such a class exists somewhere and, thus, pointers declared to point to instances of said class are perfectly valid. However, you couldn't call a method on an instance reference whose type is only defined as an @class because there is no additional metadata available to the compiler (I can't remember if it reverts the call site to being evaluated as a call through id or not).

In your example, the @class is harmless, but entirely unnecessary.

like image 122
bbum Avatar answered Sep 22 '22 03:09

bbum


@class TestClass; 

This merely declares "class TestClass will be defined".

In this case (the one you pasted) this has no effect of whatsoever, so these are the same.

However, in case you're going to define a protocol that would use your class name (as type of parameters passed to delegate, for example), you will need to declare @class TestClass before the protocol definition, as your class is still not defined.

In general, if you need to mention your class name before the class definition is made, you will need to issue @class declaration first

like image 34
poncha Avatar answered Sep 20 '22 03:09

poncha