User login


Resum del Llenguatge Objective-C


L'Objective-C afegeix un petit número de construccions al llenguatge C i defineixen un munt de convencions per interacturar de forma efectiva amb el sistema d'execució. Aquest apèndix llista tots els afegits al llenguatge però no hi entra en detall. Per més informació, mireu "El Llenguatge Objective-C". Per una presentació més formal de la sintàxi de l'Objective-C mireu "Gramàtica pel Llenguatge Objective-C".

Continguts

Missatges
Tipus Definits
Derectives de Preprocessador
Directives del Compilador
Classes
Categories
Protocols Formals
Declaracins de Mètodes
Implementació de Mètodes
Convencions de Noms

Missatges

Les expressions de missatges estan tancades entre claus escairades:

[receptor missatge]

El receptor pot ser:

  • Una variable o expressió que dona un objecte (inclòs la variables self
  • Una nom de classe (indicant l'objecte de classe)
  • super (indicant una alternativa de búsqueda per la implementació del mètode)

 

El missatge és el mateix que un mètodes més alguns arguments que se li passen.


Tipus Definits

Els principals tipus utilitzats en Objective-C estan definits a objc/objc.h. Aquests són:

Tipus Definició
id Un objecte (un punter a la seva estructura de dades).
Class Un objecte de Classe (un punter a la estructura de dades de classe).
SEL Un selector, un codi assignat pel compilador que identifica un nom de mètode.
IMP Un punter a una implementació d'un mètode que retorna un id
BOOL Un valor Booleà, pot ser YES o NO.

l'id pot utilitzar-se per qualsevol varietat de tipus d'objecte, classe o instància. A demés, els noms de classe poden utilitzar-se com a noms de tipus per estàticament indicar el tipus de les instàncies d'una classe. La definició estàtica del tipus d'instància es declara per ser un punter a la seva classe o a qualsevol classe que hi heredi.

El fitxer de capçalera objc.h també defineix alguns termes utilitzats:

Tipus Definició
nil Un punter d'objectge nul, (id)0.
Nil Un punter d'objecte classe, (Class).


Directives del Preprocessador

El preprocessador enten aquestes notacions especials:

Notació Definició
#import Importa un fitxer de capçalera. Aquesta directiva és idèntica a #include, excepte que no inclou el mateix fitxer més d'un cop.
// Comença un compentari que continua fins al final de la linia.


Directives del Compilador

Les directives del compilador comencen amb "@". Les següents directives s'utilitzen per declarar i definir classes, categories i protocols:

Directiva Definició
@interface Compença la declaració d'una classe o interfície de categoria.
@implementation Comença la definició d'una classe o categoria.
@protocol Comença la declaració d'un protocol formal.
@end Finalitza la declaració/definició d'una classe, categoria, o protocol.

Les següents directives mutuament excloents especifiquen la visibilitat de les variables de la instànci:

Directiva Definició
@private Limita l'àmbit d'una variable a la classe que el declara.
@portected Limita l'àmbit de la variable a les classes que la declaren i hereves.
@public Elimina les restriccions en l'àmbit de les variables.

Per defecte és @protected.

Aquestes directives suporten la captura d'excepcions:

Directiva Definició
@try Defineix un bloc dins el que les excepcions poden ser capturade.
@throw Transmet una excepció.
@catch() Captura una excepció llençada dins del block @try precedent.
@finally Defineix un bloc de codi que s'executa si les excepcions s'han enviat o no en el bloc @try precedent.

A demés, hi ha directives per aquestes situacions particulars:

Directiva Definició
@class Declara els nomes de les classes definides en algun lloc.
@selector (mètode) Retorna el selector compilat que identifica el mètode.
@protocol (nom) Retorna el protocol nom (una instància de la classe Protocol). (@protocol també és vàlid sense (nom) per enviar declaracions).
@encode (spec) Cedeix una cadena de caràcters que codifica una estructura de tipus spec.
@defs (nom_classe) Cedeix l'estructura interna de dades de les instàncies nom_classe.
@"string1" Defineix una constant d'objecte NSString en el mòdul actual i l'inicialitza amb l'strig codificat en 7 bits ASCII.
@"string1"
@"
string2" ...
@"
stringN"
Defineix una constant d'objecte NSString en el mòdul actual. L'string creat és el resultat de la concatenació dels estrings especificats en les dues directives.
@synchronized () Defineix un bloc de codi que només pot executar-se a la vegada per un fil.


Classes

Una classe nova és declara amb la directiva @interface. El fitxer d'interfície per aquesta superclasse ha d'importar-se:

#import "EsUnaSuperclasse.h"

@interface NomClasse : EsUnaSuperclasse < llista de protocols >
{
declaració de variables d'instància
}
declaració de mètodes
@end

Totes, excepte les directives del compilador i el nom de la classe són opcionals. Si el doble-punt i el nom de la superclasse són omeses, la classe és declarada per ser una nova classe arrel. Si alguns protocols es llisten, els fitxers de capçalera on estiguin declarats també s'hauran d'importar.

Un fitxer que contingui una definició de classe importa la seva pròpia interfície:

#import “NomClasse.hâ€?

@implementation NomClasse
Definicions de mètodes
@end


Categories

Una categoria es declara de forma molt semblant a una classe. El fitxer de la interfície que declara la classe ha d'importar-se:

#import "NomClasse.h"

@interface NomClasse ( NomCategoria ) < llista de protocols >
declaracions de mètodes
@end

La llista de protocols i les declaracions de mètodes són opcionals. Si algún protocol és llistat, els fitxers de capçalera on estan declarats també hauran d'importar-se.

Com en la definició de la classe, un fitxer que conté una definició de categoria importa la seva pròpia interfície:

#import "NomCategoria.h"

@implementation NomClasse ( NomCategoria )
definicions de mètodes
@end


Protocols Formals

Els protocols formals estan declarats utilitzant la directiva @protocol:

@protocol NomProtocol < llista de protocols >
declaracions de mètodes
@end

La llista de protocols incorporats i de declaració de mètodes són opcionals. El protocol ha d'importar els fitxers de capçalera que declara qualsevol protocol que hi incorpora.

Pots crear una començament de referència d'un protocol utilitzant la directiva @protocol() de la següent manera:

@protocol NomProtocol;

Dins el codi font, els protocols es refereixen utilitzant la directiva similar @protocol(), on els parèntesi tanquen els noms del protocol.

El noms de protocols llistats dins de les claus en angle (<...>) s'utilitzen per fer tres coses diferents:

  • En una declaració, per incorporar altres protocols (mostrats anteriorment)
  • En una declaració de classe o categoria, per adoptar el protocol ( com es mostra a "Classe" i a "Categories")
  • En una especificació de tipus, per limitar el tipus d'objectes que s'ajusten al protocol

 

Dins les declaracions del protocol, aquests quanlificadors de tipus suporten els missatges remots:

Qualificador de Tipus Definició
oneway El mètode és per missatges asincrons i no és vàlid un tipus de retorn.
in Els arguments passa informació pel receptor remot.
out Els arguments obtenen informació retornada per referència.
inout Ambdos arguments passen informació i obtenen informació.
bycopy Una copia de l'objecte, no un apoderat, ha de passar-se o retornar-se.
byref Una referència a l'objecte, no una copia, ha de passar-se o retornar-se


Declaració de Mètodes

Les següents convencions s'utilitzen en la declaració de mètodes:

  • Un "+" precedeix les declaracions de mètodes de classe.
  • Un "-" precedeix les declaracions de mètodes d'instàncies.
  • Els arguments es declaren després dels doble-punt (Smiling. Normalment, una etiqueta descrivint l'argument precedeix el doble-punt. Ambdues etiquetes i els doble-punts es consideren part del nom del mètode.
  • L'argument i els tipus de retorn es declaren utilitzant la sintaxi de C per l'assignació de tipus.
  • El tipus de retorn per defecte i el tipus d'argument pels mètodes són id, no int com passa a les funcions. (Tanmateix, el modificador unsigned quan s'utilitza fora dels següents tipus sempre signifiquen unsigned int.)

Implementació de Mètodes

A cada implementació de mètode es passen dos arguments ocults:

  • L'objecte receptor (self).
  • El selector per al mètode (_cmd).

 

Dins la implementació, tant self com super es refereixen a l'objecte receptor. super substitueix self com a receptor d'un missatge per indicar que només els mètode heredats per la implementació poden ser executats en resposta al missatge.

Els mètodes amb cap altre retorn normalment vàlid retornen void.


Convencions de Noms

Els noms de fitxers que contenen codi Objective-C tenen la extensió .m. Els fitxers que declaren les interfícies de classe i categoria o que declaren protocols tenen la extensió .h normal en fitxers de capçalera.

Els noms de classe, categoria, i protocols normalment comencen amb un lletra en majuscula; els noms de mètodes i variables d'instància normalment comencen amb una lletra en minuscula. Els noms de variables que mantenen instàncies normalment també comencen amb lletres minuscules.

En Objective-C, els noms idèntics que tenen propòsits diferents no es molesten. Dins una classe, els noms poder assignar-se lliurement:

  • Una classe pot declarar mètodes amb els mateixos noms que mètodes en altres classes.
  • Una classe pot declarar variables d'instància amb els mateixos nomes que variables d'altres classes.
  • Una mètode d'instància pot tenir el mateix nom que un mètode de classe.
  • Un mètode pot tenir el mateix nom que un variable d'instància.
  • Els noms de mètodes que comencen amb "_", un únic caràcter de guió baix, estan reservades per utilitzar-se per Apple.

 

De la mateixa manera, els protocols i categories de la mateixa classe tenen espais de noms protegits:

  • Un protocol pot tenir el nom que una classe, una categoria, o qualsevol altre.
  • Una categoria d'una classe pot tenir el mateix nom que una categoria d'una altra classe.

 

Tanmateix, els noms de classes estan en el mateix espai de noms que les variables globlas i els tipus definits. Un programa no pot tenir una variables globar amb el mateix nom que una classe.