iOS 关于OC的理解和特性分析

OC的理解和特性

多年之前,接触OC开始,就知道它是一门面向对象的语言。最为面向对象的语言,我们就不得不提起面向对象的三大支柱:封装、继承、多态。这三大特性,时常会运用在我们日常的开发过程中,支撑着我们的每一个项目。

三大特性

  1. 封装:即隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。在面向对象编程中,封装(encapsulation)是将对象运行所需的资源封装在程序对象中——基本上,是方法和数据。对象是“公布其接口”。其他附加到这些接口上的对象不需要关心对象实现的方法即可使用这个对象。这个概念就是“不要告诉我你是怎么做的,只要做就可以了。”
  2. 继承:可以使得子类别具有父类别的各种属性和方法,而不需要再次编写相同的代码。在令子类别继承父类别的同时,可以重新定义某些属性,并重写某些方法,即覆盖父类别的原有属性和方法,使其获得与父类别不同的功能。
  3. 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法(OC中的多态 不同对象对同一消息的不同响应.子类可以重写父类的方法),更通俗一点的讲:用一个父类的指针指向子类的对象,在函数(方法)调用的时候可以调用到正确版本的函数(方法)

使用多态的条件
1.子类必须重写父类的方法
2.父类指针指向子类对象

OC的特点

既具有静态语言的特性(如C++),又有动态语言的效率(动态绑定、动态加载等)

Objective-C具有很多动态特性,主要表现为三大方面:动态类型(Dynamic typing)动态绑定(Dynamic binding)和动态加载(Dynamic loading)。动态——必须到运行时(run time)才会做的一些事情。
动态类型:即运行时再决定对象的类型,这种动态特性在日常的应用中非常常见,简单来说就是id类型。事实上,由于静态类型的固定性和可预知性,从而使用的更加广泛。静态类型是强类型,而动态类型属于弱类型,运行时决定接受者。
动态绑定:基于动态类型,在某个实例对象被确定后,其类型便被确定了,该对象对应的属性和响应消息也被完全确定。
动态加载:根据需求加载所需要的资源,最基本就是不同机型的适配,例如,在Retina设备上加载@2x的图片,而在老一些的普通苹设备上加载原图,让程序在运行时添加代码模块以及其他资源,用户可根据需要加载一些可执行代码和资源,而不是在启动时就加载所有组件,可执行代码可以含有和程序运行时整合的新类。
后续再归纳OC动态特性是怎么做到的–runtime

简单的OC的内存管理理解

MRC:OC内存管理遵循“谁创建,谁释放,谁引用,谁管理”的机制,当创建或引用一个对象的时候,需要向她发送alloc、(mutable)copy、retain消息,当释放该对象时需要发送release消息,当对象引用计数为0时,系统将释放该对象,这是OC的手动管理机制(黄金法则)
ARC:这是在iOS5之后出现的(自动引用计数),管理机制与手动机制一样,只是不再需要调用retain、release、autorelease;它编译时的特性,当你使用ARC时,在适当位置插入release和autorelease;(ARC和MRC是对应的。只不过在ARC下,对象“持有”和“释放”的内存管理代码交由系统去调用罢了。)

在dealloc方法中,ARC只能帮我们处理OC对象。如果实例变量持有类似CoreFoundation等非OC对象,则需要我们手动回收:

在ARC中,并不是直接执行retain和autorelease操作的,而是通过以下两个方法:

	objc_autoreleaseReturnValue(obj);//对应autorelease
    objc_retainAutoreleasedReturnValue(obj);//对应retain

关于@autoreleasepool{}

通常情况下,我们是不需要手动添加 @autoreleasepool{} 的,使用线程自动维护的 @autoreleasepool{} 就好了。根据苹果官方文档中对 Using Autorelease Pool Blocks 的描述,我们知道在下面三种情况下是需要我们手动添加 @autoreleasepool{} 的:
1.编写的程序不是基于 UI 框架的,比如说命令行工具;
2.编写的循环中创建了大量的临时对象;
3.创建了一个辅助线程。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
UDP是一种无连接的协议,因此在iOS中使用UDP发送和接收数据与TCP有所不同。以下是OC实现UDP发送和接收的基本步骤: 发送UDP包: 1. 创建UDP socket: ``` int udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); ``` 2. 设置发送地址和端口: ``` struct sockaddr_in serverAddr; memset(&serverAddr, 0, sizeof(serverAddr)); serverAddr.sin_family = AF_INET; serverAddr.sin_addr.s_addr = inet_addr("目标IP地址"); serverAddr.sin_port = htons(目标端口); ``` 3. 发送数据: ``` NSString *message = @"hello"; const char *msg = [message UTF8String]; sendto(udpSocket, msg, strlen(msg), 0, (struct sockaddr *)&serverAddr, sizeof(serverAddr)); ``` 接收UDP包: 1. 创建UDP socket: ``` int udpSocket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); ``` 2. 设置socket端口和地址: ``` struct sockaddr_in localAddr; memset(&localAddr, 0, sizeof(localAddr)); localAddr.sin_family = AF_INET; localAddr.sin_addr.s_addr = htonl(INADDR_ANY); localAddr.sin_port = htons(本地端口); bind(udpSocket, (struct sockaddr *)&localAddr, sizeof(localAddr)); ``` 3. 接收数据: ``` char buffer[1024]; struct sockaddr_in clientAddr; socklen_t clientAddrLen = sizeof(clientAddr); ssize_t recvLen = recvfrom(udpSocket, buffer, sizeof(buffer), 0, (struct sockaddr *)&clientAddr, &clientAddrLen); if (recvLen > 0) { NSString *message = [[NSString alloc] initWithBytes:buffer length:recvLen encoding:NSUTF8StringEncoding]; } ``` 注意:在使用UDP协议时,需要注意数据包的大小和可靠性问题,因为UDP是无连接的,数据包可能会丢失或乱序。在实际应用中,需要根据具体情况选择合适的协议和方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值