2010-08-15 6 views
7

Si tengo una clase personalizada NSObject llamada ProgramModel, ¿obtiene alloc/init -ed cuando I @property y @synthesize de otra clase? Por ejemplo, en una clase ProgramController como esto¿Es una propiedad sintetizada ya alloc/init -ed?

// ProgramController.h 
#import "ProgramModel.h" 
@interface ProgramController : UIViewController { 
    ProgramModel *programModel; 
} 
@property (nonatomic, retain) ProgramModel *programModel; 

// ProgramController.m 
#import "ProgramController.h" 
@implementation ProgramController 
@synthesize programModel; 
// etc 

hará también necesito alloc/init en el initWithNibName o viewDidLoad, o ya sea que alloc/init -ed debido a la property/synthesize?

Respuesta

9

Debe completar la propiedad manualmente. La excepción es si tiene un IBOutlet property que ha conectado en un archivo de punta; que se poblará automáticamente cuando se cargue el plumín.

Me parece que para los controladores de vista la gran mayoría de las propiedades son IBOutlets y las propiedades que describen lo que mostrará la vista, y este último caso generalmente lo establece el objeto que crea el controlador de vista. Ese será generalmente el caso para un controlador de vista que muestra una vista de detalle para algún objeto.

Si tiene propiedades que son completamente locales para el controlador de vista, un patrón común es escribir su propio getter y setter (en lugar de usar @synthesize) y crear el objeto en el getter si no existe. Este comportamiento de carga diferida significa que puede liberar recursos fácilmente en condiciones de poca memoria, y que solo paga el costo de cargar un objeto cuando lo necesita.

// simple lazy-loading getter 
-(MyPropertyClass*)propertyName { 
    if(propertyIvarName == nil) { 
     propertyIvarName = [[MyPropertyClass alloc] init]; 
     // ... other setup here 
    } 
    return propertyIvarName; 
} 
+0

* técnicamente * la salida es 'nil' hasta que se cargue la plumilla, lo que (en el caso de NSWindow/ViewController) no ocurrirá hasta que invoque' [ventana de controlador] 'o' [vista de controlador] ' . –

+0

No estoy seguro de cuál es la distinción que estás dibujando aquí. Dije "cuando el plumín está cargado" ... –

+0

@Seamus sí, solo quería aclarar que cargar el plumín no ocurre necesariamente durante la inicialización. me han picado tantas veces al intentar acceder a tomas que no estaban allí porque aún no había cargado la punta. –

6

De forma predeterminada, todas las variables de instancia están a cero. En el caso de los objetos, eso significa que son nil. Si desea un valor inicial en la propiedad, debe colocarlo allí durante su método de inicialización/viewDidLoad.

1
  • @property sólo declara los métodos de captador/definidor.
  • @synthesize solo genera los accesorios para usted.

No se les asignan valores automáticamente, salvo que la memoria se ponga a cero. Además, debe establecerlos en cero en -dealloc para evitar una fuga.

Tampoco tiene sentido "asignar una propiedad". Una propiedad de objeto es un puntero. (Y piense en lo que sucede si tiene una clase de lista vinculada ...)

(Nota: Los atributos de propiedad también afectan al método @synthesized, y las propiedades también son conocidas por el tiempo de ejecución; vea class_copyPropertyList() y amigos .)

Cuestiones relacionadas