Classes

Classes allow the programmer to define types which can be messaged, can create objects, and are polymorphic.

Note: This document quotes from https://en.cppreference.com/w/c/language/struct, dual-licensed under the CC-BY-SA 3.0 and unversioned GFDL with no invariant sections, front-cover texts, or back-cover texts.

Forward declaration

Grammar summary

@class name (, name)*opt ;

Grammar

objc-class-declaration: : @ class objc-class-forward-decl (, objc-class-forward-decl)* ;

objc-class-forward-decl: : identifier objc-type-parameter-listopt

objc-type-parameter-list: : < objc-type-parameter (, objc-type-parameter)* >

objc-type-parameter: : objc-type-parameter-varianceopt identifier objc-type-parameter-boundopt

objc-type-parameter-bound: : : type-name

objc-type-parameter-variance: : __covariant : __contravariant

Discussion

This declares that a class with the name name exists. After this, the type name is now defined.

This works similary to forward-declaring a struct, but you cannot use the keyword @class outside of a forward-declaration.

The following are invalid:

id greet(@class NSGreeter aGreeter)
@class NSGreeter myGreeter = [[NSGreeter alloc] init]

Class interface

[ attr-spec-seq ]
@interface name [ < generic-param > ] [ : superclass-name ] [ < protocol-list > ]
[ { ivar-declaration-list } ]
[ method-declaration-list ]
@end

attr-spec-seq (optional)
Attributes to add to the class

name
The name of the class being defined

generic-param (optional)
A typename parameter. See Lightweight Generics

superclass-name (optional)
The superclass of the class being defined

ivar-declaration-list
A list of variables that each instance of the class will have in their storage.

method-declaration-list
A list of method declarations. See § Methods for more information.

Class implementation

Methods

Class names in code

You can use the name of a class in code as either a type name followed by a *, or an object to send a message to.

GOOD:

NSString* myString = [[NSString alloc] init];

You cannot use the class name as an object of type Class:

BAD:

Class myClass = NSObject;

Instead, send the method +class to the object:

GOOD:

Class myClass = [NSObject class];