Resumen de conocimientos sobre desarrollo de iOS (1)

1. Configuración de la herramienta Xcode
1. Configuración de acceso a la red:
agregue configuración de seguridad de transporte de aplicaciones->NSAllowsAritraryLoads-> YES en el archivo Info.plist
2. Configuración de permisos después de iOS10: también debe agregar Privacidad - Uso de la biblioteca multimedia
directamente en la información Archivo .plist
Descripción Acceder a la biblioteca multimedia
Privacidad: uso de periféricos Bluetooth Descripción El acceso a funciones del sistema como Bluetooth requiere autorización cuando se llama.
3. Hay dos formas de configurar las operaciones anteriores
<1>. Abra el archivo Info.plist directamente en Xcode y agréguelo directamente, como se muestra en la figura:
Operación directa de info.plist
<2>. Seleccione Info.plist->clic derecho- >Abrir como->Código fuente, como se muestra en la figura:
Abrir como código fuente
Después de abrir, es el siguiente, puede agregarlo directamente en el código:
Abra el archivo Info.plist en ccode
2. Modo de diseño
1. ¿Qué es el modo de diseño?
En diseño de software, ¡es una solución reutilizable para un problema común!

2. ¿Por qué utilizar patrones de diseño?
Los patrones de diseño son una serie de plantillas que le ayudan a escribir código más comprensible y reutilizable. Los patrones de diseño le ayudan a crear código de bajo acoplamiento para que pueda cambiar o reemplazar componentes en el código sin mucho esfuerzo.

3. ¿Cuáles son los tipos de patrones de diseño?
<1>. Tipo de creación: singleton (estado único) y fábrica abstracta
<2>. Tipo estructural: modelo-vista-controlador, decorador, adaptador, apariencia y modo combinado
<3>. Tipo de comportamiento: observador, memo, cadena de responsabilidad y modelo de mando

4. ¿Cuándo, cómo y qué tipo de patrones de diseño se utilizan?
<1>.MVC (desacoplamiento y) (reutilización-expandir-mantener)
Modelo-Vista-Controlador Modelo-Vista-Controlador El modelo y la vista son independientes entre sí y no conocen la existencia del otro, el controlador es responsable de ellos. La comunicación y la conexión entre ellos logran un bajo acoplamiento, lo que hace que el código sea fácil de reutilizar, mantener y expandir
; el comportamiento del controlador se realiza a través de tres tecnologías, delegado, acción objetivo y notificación-kvo;
C vs M: API
C a V : Salida
V a C: Acción objetivo, Delegado, Fuente de datos
M a C: Notificación, KVO

<2> Concepto de modo singleton (único para todo el objeto del proyecto/ahorro de recursos-variables globales/mantenimiento de datos)
:
la estructura central solo contiene una clase especial llamada singleton y declara estáticamente el objeto singleton (variables globales) para garantizar que Este proyecto es el único objeto de instancia (y es fácil acceder a la instancia desde el mundo exterior). El ciclo de vida de las variables y atributos de instancia del objeto es el principio y el final de todo el proyecto. El propósito es guardar y compartir datos. ¡Preste atención al bloqueo en condiciones de subprocesos múltiples para evitar que múltiples subprocesos creen singletons al mismo tiempo! (Si necesita llamar a las propiedades del objeto varias veces para guardar y agregar datos, use un singleton. La creación repetida de objetos ordinarios no puede guardar datos a largo plazo)

Ventajas:
a. La creación de asignación de objetos desperdicia tiempo y recursos del sistema, mientras que el singleton ahorra recursos y tiempo; b
. Múltiples módulos acceden a la misma variable, y el acceso singleton es fácil. Los datos se guardan y comparten, evitando el riesgo y la complejidad de la transferencia mutua entre múltiples módulos c.Objeto
de instancia global único;

Desventajas:
el patrón singleton hace que el objeto sea global, lo que reduce la flexibilidad de cada módulo individual;

Singleton típico del sistema

  • UIApplication (instancia de aplicación)
  • NSNotificationCenter (Centro de mensajes)
  • NSFileManager (gestión de archivos)
  • NSUserDefaults (sistema único)
  • NSURLCache (solicitar caché)
  • NSHTTPCookieStorage (grupo de cookies de la aplicación)

Obtener APPDelegate

AppDelegate *app = (AppDelegate *)[UIApplication sharedApplication].delegate;

Ejemplo de caso único

+(MyUserInfo *)sharedInstance{
    static MyUserInfo *userInfo = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken,^(void) {
        userInfo = [[self alloc] initialize];
    });
    return userInfo;
}

static HttpRequestManager *manager = nil;
+(HttpRequestManager *)shareManager{
    @synchronized(self){
        if (manager == nil) {
            manager = [[HttpRequestManager alloc] init];
        }
    }
    return manager;
}

3. Patrón de observador (notificación y mensajes y valores de transmisión KVO entre clases/desacoplamiento) (correspondiente al
Modelo-Controlador en MVC usando Notificación y kvo)
<1>.KVC/KVO (codificación clave-valor-copia por lotes/clave -Valor Observación)
KVC se utiliza principalmente para la asignación por lotes, existen dos métodos: setter setValue:@"" forKey:@""y valueForKeygetter respectivamente.

Model *model = [[Model alloc]init];
[model setValue:string forKey:key]; //key为model的属性 string为赋值

Al asignar valores a las propiedades de un objeto, utilice:

User* user = [[User alloc] init];
[user setValue:@"张三" forKey:@"name"]
[user setValue:@"65" forKey:@"weight"];

Si el valor del atributo del objeto de KVO cambia, se le notificará para realizar las operaciones correspondientes:

[user addObserver:self forKeyPath:@"name" options:NSKeyValueObservingOptionNew context:NULL];

Función de procesamiento posterior al cambio:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    …
}

Notificación NSNotification (al pasar mensajes y valores entre clases, el remitente y el receptor del mensaje no se conocen en absoluto, completamente desacoplados; se pueden crear múltiples observadores, el mensaje tiene una naturaleza de transmisión, tenga cuidado de cerrar sesión observación al centro de notificaciones cuando no sea necesario Por)

//发送通知
[[NSNotificationCenter defaultCenter]  postNotificationName:@"postData" object:saveImageArray];

//接收通知
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(PostImage:) name:@"postData" object:nil];
//接收通知实现方法
-(void)PostImage:(NSNotification*) notification{ 
    //接收到消息后实现内容
}
//移除通知中⼼
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"postData" object:nil];  

Principio de implementación de notificación / Principio de implementación de KVO
El principio de notificación es que el extremo receptor registra la función de recepción en la matriz del centro de notificaciones, y el extremo emisor llama directamente a la función de registro del extremo receptor anterior al enviar datos. NSNotification es un método sincrónico, KVO es agregue observaciones a los objetos de atributo de interés o se nos notificará cuando el valor del atributo cambie y podremos manejar el cambio en consecuencia.

4. Modo proxy (devolución de llamada - herencia múltiple - desacoplamiento y suma) (correspondiente a View-Controller en MVC usando Delegate o Datasource)
<1> Acuerdo: desarrolle el acuerdo y defina el método, quien cumpla con el acuerdo implementará el método;
<2>.Proxy: a menudo combinado con el protocolo, configura el proxy, el proxy llama al método del protocolo; cumple con el proxy, implementa el método del protocolo proxy; equivalente al contenido de implementación del método y el valor de retorno de la clase A en la clase B ;<3>.Pasos
:

  • Definir protocolos y establecer métodos;
  • Configure el proxy y el proxy llama al método de protocolo;
  • Cumplir con el acuerdo, aceptar al agente y el agente implementa el método del protocolo;

Establecer el método de protocolo en el archivo .h

#import <UIKit/UIKit.h>
//  协议方法
@protocol ReplyInputViewDelegate <NSObject>
-(void)clickSenderReplyButton:(UIButton *)sender;
@end
//  设置代理
@property (nonatomic,strong) id<ReplyInputViewDelegate>delegate;

Implementado en .m

-(void)clickSenderButton:(UIButton *)sender{
 if (self.delegate &&[self.delegate respondsToSelector:@selector(clickSenderReplyButton:)]) {
        [self.delegate clickSenderReplyButton:sender];
    }
}

En el controlador el medicamento sigue al agente e implementa el método:
Establecer proxy
Implementar métodos de protocolo.

La diferencia entre métodos y métodos de protocolo (entre clases y clases, los protocolos no son clases pero son equivalentes a clases)
a. Los métodos generalmente solo se pueden implementar en una clase. La ventaja del método de protocolo es que este método se puede implementar en cualquier clase Después de implementar la devolución de llamada, la implementación del método de protocolo es un módulo independiente en relación con toda la clase, logrando desacoplamiento y desacoplamiento; si una clase hereda una clase, el método de esta clase se puede refactorizar y no se puede heredar en otras lugares, que es herencia única; a través del protocolo hereda el método del protocolo, lo que equivale a reconstruir el método para lograr algo similar a la
herencia
El protocolo implementa parte de la función de herencia múltiple (cumplir con el protocolo es equivalente a heredando el método del protocolo). Después de cumplir con el protocolo, hay @optional disponible. Elija el método que debe implementarse y @required. El protocolo es la interfaz estándar, el proxy es un patrón de diseño. Cuando ciertas funciones de una clase no están implementadas por sí solos, deben ser implementados por cualquier clase;

5. Los bloques de modo de fábrica simples
(que reemplazan algunas funciones de protocolo - interfaces - devoluciones de llamada)
reemplazan algunas funciones de proxy de protocolo. Es fácil de usar y no requiere demasiadas interfaces de definición @protocol. Principalmente implementa interfaces, transferencia de valor inverso y devoluciones de llamada. ¡Código!

typedef NSString *(^loggerBolck)(NSString *) ;//定义
//实现
loggerBolck blocks = ^(NSString *str){
    ...
 }; 
NSString *allstr = @"allstr";
NSString *str = @"str";
str = blocks(allstr); //调⽤
NSString *(^loggerBolck)(NSString *) ;
loggerbolck = ^(NSString *str){
    ... 
};
NSString *allstr = @"allstr";
NSString *str = @"str";
str = loggerbolck(allstr);
NSString *(^loggerbolck)(NSString *)= ^(NSString *str){
    ... 
};
NSString *allstr = @"allstr";
NSString *str = @"str";
str = loggerbolck(allstr);

Bloquear puntos a tener en cuenta

blocks在类中做属性要⽤copy(⽆论arc和mrc) //保留blocks⽣命周期,copy不⽤retain,要注意release,否则就autorelease
__weak typeof(self) weakSelf = self;//把⾃⼰设置位弱引⽤
//__weak TCPClient *weakSelf = self; blocks⾥调⽤self时要设成弱引⽤对象,避免循环引⽤;防⽌在block中⽤到self时把self对象retain, 造成内存泄露;
typedef void(^SendMessage)(MessageObject*); //定义block
__weak TCPClient *weakSelf = self; //self设置为弱引⽤
//实现blocks
SendMessage sendMessage = ^(MessageObject *messageObejct){
        NSString *sendString = [NSString stringWithFormat:@"%@",[messageObejct convertToString]];
    NSData *sendData = [sendString dataUsingEncoding:NSUTF8StringEncoding];
    [weakSelf.socketClient writeData:sendData withTimeout:-1 tag:0];
    [weakSelf.socketClient readDataWithTimeout:-1 tag:0];
}; 

self.sendMessage (messageObject); //调⽤blocks

Nota: Esta es la primera vez que escribo, si hay algún error, por favor critíqueme y corríjame, crezcamos juntos.

Supongo que te gusta

Origin blog.csdn.net/chuzhaohzi/article/details/56844233
Recomendado
Clasificación