Los Arreglos NSMutableArray en objetive C
A diferencia de los NSArray… a estos se les pueden agregar y objetos al gusto…
A diferencia de los NSArray… a estos se les pueden agregar y objetos al gusto…
Los diccionarios en Objetive C son como los hashes en perl …
o como los Diccionarios en Python,
O como los arreglos asociativos en Php
o como los Hashmap en Java
o como los hashes en ruby.
El siguiente ejemplo al invocar el indice @Dog … esto nos retornara “House pet”
Nota.. al igual que los NSArray … se debe finalizar la inicializacion de un NSDictionary con un nil (el equivalente a NULL en otros lenguajes).
Tambien podemos recorrerlo al viejo estilo de los perleros el foreach
Los NSArray son arreglos en objetive c que no se pueden ALTERAR una vez definidos…. y tienen que terminal en null..
He aqui la forma en que se iteran…
Tambien podemos recorrelo al estilo foreach
Asi como los pajaritos y las abejas de nuestro mundo real, objectos dentro de la aplicacion tiene un ciclo de vida. Ellos nacen (via un alloc o un new), viven ( reciben mensajes y crean cosas utiles ), hacen amigos (via composicion y por ser pasados como argumentos a metodos), y eventualmente moriran cuando su periodo de vida este sobrepasado. Cuando todo esto sucede, el polvo que de ellos queda (memoria) es reciclado y reaprovechado para la nueva generacion.
1. — Conteo por Referencia (Reference Counting)
Cocoa usa una tecnica conocida como conteo por referencia, algunas veces tambien llamada “retain counting“. Donde cada objeto tiene un integer asociado con el, este entero asociado es conocido como su referencia de conteo o retain count. Cuando una parte de codigo esta interesada en un objeto, esta parte de codigo incrementara la referencia de conteo de dicho objeto (diciendo “Yo estoy estoy interesado en este objeto cabron!”). Pero cuando esta parte de codigo haya satisfecho su mas bajos instintos con el objeto y ya no lo necesite mas…, entonces el conteo de referencia de dicho objeto pasara a Cero. Entonces como a nadie mas le interesa este objeto, entonces pasara a ser destruido y su memoria reciclada.
Cuando un objeto es creado via alloc o new, o via a copy, el conteo de referencia del objeto es aumentado a 1. Para incrementar el conteo de referencia de un objeto se invoca el metodo retain. Para decrementar el conteo de referencia de un objeto se invoca el metodo release.
Cuando un objeto esta siendo destruido es por que su conteo de referencia a alcanzado su valor 0, Objective-C mandara automaticamente la ejecucion del metodo dealloc del objeto.
Veamos un ejemplo… aqui defino mi clase y la implementacion de la misma
@interface RetainTracker : NSObject
@end // RetainTracker
@implementation RetainTracker
- (id) init {
if (self = [super init]) {
NSLog (@"init: Retain count of %d.",
[self retainCount]);
}
return (self);
} // init
- (void) dealloc
{
NSLog (@"dealloc called. Bye Bye.");
[super dealloc];
} // dealloc
@end // RetainTracker
Y aqui hago uso de ella para demostrar el uso de retain y release
int main (int argc, const char *argv[])
{
RetainTracker *tracker = [RetainTracker new];
// count: 1
[tracker retain]; // count: 2
NSLog (@"%d", [tracker retainCount]);
[tracker retain]; // count: 3
NSLog (@"%d", [tracker retainCount]);
[tracker release]; // count: 2
NSLog (@"%d", [tracker retainCount]);
[tracker release]; // count: 1
NSLog (@"%d", [tracker retainCount]);
[tracker retain]; // count 2
NSLog (@"%d", [tracker retainCount]);
[tracker release]; // count 1
NSLog (@"%d", [tracker retainCount]);
[tracker release]; // count: 0, dealloc it
return (0);
} // main
Y aqui nuestra salida a pantalla….
El conteo de referencia nos ayuda a evitar una gran cantidad de problemas surguidos al compartir memoria entre diferentes clases y objetos, pero plantea problemas a la hora de decidir donde y quien debe ejecutar los releases.
2. — Propietario del Objeto (Object Ownership)
Si un metodo tiene que devolver un objeto nuevo y no guarda ningun puntero al mismo ¿Como libera la memoria de este nuevo objeto … ? como no guarda el puntero no puede hacer el release más tarde, tampoco lo puede ejecutar inmediatamente porque si lo hace se liberará la memoria en este mismo momento y producirá el fallo al intentar usarla. Y tampoco es buena idea devolverlo sin el release, por que en este caso se producira un leak si la otra clase no la libera. Aqui entra en juego la convencion Ownership
Según esta convención, todo objeto es responsable de liberar la memoria que crea o retiene, pero aporta un par de reglas extras para solucionar el problema anterior:
Regla A)
Cuando un objeto va a utilizar memoria creada por otro método debe hacer un retain para evitar su liberación prematura.
Regla B)
Todo objeto debe liberar la memoria creada (mediante métodos alloc, copy o new) y retenida (mediante método retain), invocando el método release en algún momento en su ciclo de vida. Por cada alloc/retain ejecutado debe hacerse un release.
Regla C)
Si un método devuelve un objeto que no va a liberar, el método deberá llamarse allocXXX, copyXXX o newXXX (donde XXX se sustituye por el nombre que elijas). De esta forma, el que invoca el método puede conocer esta característica y, aplicando la regla B podra librerarla. Esta misma regla podría aplicarse N veces si cada método devuelve a su vez el objeto nuevo a su padre.
Ejemplo convención Ownership:
- (Clase *) newObjectWithData:(NSData *)data{
//Creamos el objeto
Clase *object = [[Clase alloc] init];
//Ejecutamos lo que sea
[object setData:data];
//Devolvemos el objeto
return object;
}
En este ejemplo podemos hacer la devolución gracias a haber nombrado al método newXXX, que indicará al que lo invoque que el objeto de tipo Clase * devuelto está sin liberar.
3.– Autorelease
Por último, tenemos un último recurso que nos ayudará a gestionar la memoria. Lo he dejado al final porque no pienso tratarlo aqui, ya que desaconsejo su uso, y es mejor no mostrarlo para evitar una mala praxis.
Es traumante encontrarse con este error y no saber por qué sucede, bueno, sucede generalmente porque liberaste (release) algo que no deberías o antes de que deberías, o no lo liberaste, o sea algún retain de más o de menos.
Cuando tienes algún error de este tipo el programa terminará y el xcode te mandará un mensaje que dice algo como:
Para saber dónde está el error, suele ser un problema en proporcion al tamaño de tu codigo, a razon de esto existe algo llamado NSZombie. Y como funciona esto.. ? Los Zombies permiten que los objetos que ya han sido liberados (su retain count ha llegado a 0) mantegan una copia vacia (a esta copia es el famoso zombie). Asi entonces cuando en nuestro código llamemos al zombie, este te advertirá que estas llamando a una instancia que ya fue liberada.
¿Cómo habilito los objetos NSZombie?
Abre el proyecto en el que quieres habilitar los zombies, y ubicate sobre el ejecutable del proyecto, abre el menú contextual y selecciona Get Info, luego Ve a la pestaña de Arguments, agrega en el fondo la variable NSZombieEnabled y pon el valor en YES
Ahora corremos de nuevo el programa, solo que ahora, cuando el programa se interrumpa, no terminará, sino que se pausa, y podemos ver que manda un mensaje como el siguiente (lo que esta en amarillito):
Ahora si tratamos de continuar la ejecucion de la aplicacion podemos notar que el zombie nos dice….
Hey en esta direccion de memoria hay un Objeto vacio que fue usado como “En este caso la clase Exercise”

Hola a todos tiempo de no escribir….
Ultimamente he estado bastante ocupado liberando algunos sistemas a produccion…. (cosas tediosas pero importantes)
Bueno, aqui les dejo como generar un servidor tcp/ip que reciba tramas de texto mediante Sockets de multiples clientes, este lo he desarrollado en java…
Y como lo probe?…. utilizando netcat (nc ahora)
La parte servidor basicamente esta compuesta de dos partes….. una Clase que contendra nuestro metodo Main
Y la clase que implementara todo aquello que haremos con las tramas de texto recibidas…
Fichero con funcion Main
package com.agnux.tcp;
import java.io.IOException;
import java.net.ServerSocket;
public class Main {
/**
* @param args
*/
public static void main(String[] args) throws IOException {
ServerSocket serverSocket = null;
boolean listening = true;
try {
serverSocket = new ServerSocket(6666);
} catch (IOException e) {
System.err.println("Could not listen on port: 6666.");
System.exit(-1);
}
while (listening) { new MultiClientServer(serverSocket.accept()).start(); }
serverSocket.close();
}
}
Fichero que implementa la razon de ser de nuestro Servidor Socket multiclientes
package com.agnux.tcp;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
public class MultiClientServer extends Thread {
private Socket socket = null;
public MultiClientServer(Socket socket) {
super("MultiClientServer");
this.socket = socket;
}
public void run() {
try {
PrintWriter out = new PrintWriter(socket.getOutputStream(), true);
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
System.out.println(inputLine);
}
out.close();
in.close();
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Primera Prueba
Esto lo hice desde mi macbook…. ya se lo que estan pensando… maquina de putos… si la verdad prefiero una pc con linux… pero ya que… este comando lo corri desde la terminal de mi snowlepard
nc -v -w 2 192.168.1.181 6666 < /etc/services
Finalmente podremos ver como se despliega el flujo de texto… en la consola de la maquina donde tengas corriendo este Servidor Socket Multiclientes
Aqui les dejo algo de informacion sobre netcat http://oreilly.com/pub/h/1058
Introduccion:
Les mostrare la manera mas simple de crear un programa Hello World sobre IphoneI am going to show you the simplest way to create hello world iPhone tutorial. Para probar el codigo sobre un dispositivo (iPhone) necesitaras comprar una licencia de desarrollador la cual tiene un costo de 99$ para ti y de 299$ para una empresa.
Iniciando el Desarrollo con Iphone:
Lo primero que necesitaras es conocer c-objetive … te recomiendo bajarte algunos libros de rapidlibrary.
O tambien podrias leer “getting started with iPhone”, este tutorial cubre las cosas que tu requieres saber antes de iniciar el desarrollo para iPhone( Tambien puedes mirar el video tutorial de “Getting Started with iPhone” ).
La Idea de este tutorial
Ya existen muchos tutorial sobre Hellos Wolrd in Iphone pero se me antojo escribir uno muy muy basico sobre el iPhone sdk el cual cubre xcode, y interface builder.
Simples pasos creae aplicacion hello world iPhone
Paso 1:Abre el Xcode y da click sobre File > New Project. Select “View-Based Application” y da click sobre “Choose..” button. El nombre de este proyecto sera “Hello World” y da click sobre el boton “Save”. Ahora ya tienes una plantillapara tu proyecto iphone hello world.
Step 2:Ahora pulsa el botton Build and Go para corre esta aplicacion plantilla. Esto iniciara el simulador iPhone y podras ver una pantalla gris en este. Da click sobre el boton Home button and este te mostrara HelloWorld icon sobre el dash board del iPhone simulator.
![]()
Salida de nuestra primera aplicacion iphone
Paso 3:Ahora abre tu Xcode project y selecciona el archivo HelloWorldViewController.h y escribe el siguiente codigo:
IBOutlet UITextField *txtUserName; IBOutlet UILabel *lblUserTypedName; Also write this method before end of this class - (IBAction) submitYourName;?
Paso 4:Entonces tu archivo HelloWorldViewController.h lucira como esto:
#import@interface HelloWorldViewController : UIViewController { IBOutlet UITextField *txtUserName; IBOutlet UILabel *lblUserTypedName; } - (IBAction) submitYourName; @end
Paso 5:Ahora abriremos el archivo HelloWorldViewController.m y escribiremos este metodo antes de @end?
- (IBAction) submitYourName;
{lblUserTypedName.text = txtUserName.text;}
Paso 6:Ahora iniciermos con algo de diseño sobre el (constructor de interfaces) interface builder. Ejecuta un doble click sobre el archivo MainWindow.xib el cual es la principal ventana o punto de entrada hacia tu aplicacion.
![]()
Estructura de tu aplicacion iphone
Paso 7:Clickea sobre Herramientas y selecctiona Library (cmd + shift + L) y arrastra el campo de texto a tu vista. Como el campo de texto esta ya seleccionado, clickea sobre Tools>Inspector (cmd + 1) y en el campo de Texto teclea “Tu nombre”.
![]()
Agrega etiqueta a tu primer aplicacion iPhone
Paso 8:Ahora arrastra el componente TextField de tu Library hacia tu vista (cmd+shift+L) y tambien arrastra otra Label dentro de la vista.
![]()
Agregando un componente Text field a tu primera aplicacion iPhone
![]()
Agregando otra Label a tu primera aplicacion iPhone
Paso 9:Lo ultimo por hacer es arrastrar un boton hacia la vista y entonces abrir el Inspector de nuevo mediante el menu superior selecting tools>Inspector. En Title teclee “Submit”.
![]()
Paso 10:Ahora mapea la variable controller clase funcion y metodos con el interface builder. Seleccione File’s Owner en Interface builder y seleccione inspector de coneccion desde Tools cmd + 2
![]()
Mapea tu controller con el Interface Builder
Paso 11:Ahora tu puedes ver 2 nuevas variables son agregadas in el connection inspector txtUserName y lblUserTypedName. Clickea sobre txtUserName radio button y arrastra este a el text field en la vista (como tu puedes ver en la imagen)
![]()
Mapea tu text field con Interface builder
Paso 12:Haz lo mismo con el lblUserTypedName, selecciona su radio y arrastra es hacia abajo de la label.
![]()
Mapea tu label field con Interface builder
Paso 13:Ahora el ultimo paso es, click sobre submitYourName radio y arrastra este a el botton y selecciona touch down de la lista.
![]()
Mapea tu button con Interface builder
![]()
Establecer tipo de accion al boton
Paso 14:Ahora cierra la interface y abre xcode. And press “build and go”.
Salida final