ios 知识

news/2024/7/20 20:55:49 标签: ios, cocoa, macos

IOS 类文件.h和.m中@interface的区别
大家都知道我们在创建类文件时会发现:

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

#import "ViewController.h"

@interface ViewController ()

@end

那么他们之间有何区别呢?

1、.h里的@interface,是典型的头文件,它的属性(@property)和方法(functions)都是能够向其他类公开的。我们都知道有三种权限@private,@protected,@public。写在.h里的默认是@protected权限。

2、.m里的@interface,我们也可以称之为扩展(class extension),是.h文件中@interface的补充。可以增加属性,方法和成员变量,但是只能在.m文件里可见,对外是不开放的。在.m里的默认是@private权限

@END.

@property的作用和atomic和nonatomic

参考
当我们写下@property NSObject *foo时,编译器帮我们做了以下几件事:

创建实例变量_foo
声明foo属性的setter、getter方法
实现foo属性的setter、getter方法
@property 的本质是什么?

@property = ivar + getter + setter;

实例变量+get方法+set方法,也就是说使用@property 系统会自动生成setter和getter方法;

@property的属性关键字详解
atomic和nonatomic
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。

atomic:系统生成的 getter/setter 会保证 get、set 操作的完整性,不受其他线程影响。getter 还是能得到一个完好无损的对象(可以保证数据的完整性),但这个对象在多线程的情况下是不能确定的。

举个🌰
如果线程 A 调了 getter,与此同时线程 B 、线程 C 都调了 setter——那最后线程 A get 到的值,有3种 可能:可能是 B、C set 之前原始的值,也可能是 B set 的值,也可能是 C set 的值。同时,最终这个属性 的值,可能是 B set 的值,也有可能是 C set 的值。所以atomic可并不能保证对象的线程安全。

也就是说:如果有多个线程同时调用setter的话,不会出现某一个线程执行完setter全部语句之前,另一个线程开始执行setter情况,相当于函数头尾加了锁一样,每次只能有一个线程调用对象的setter方法,所以可以保证数据的完整性。

atomic所说的线程安全只是保证了getter和setter存取方法的线程安全,并不能保证整个对象是线程安全的。

nonatomic:就没有这个保证了,nonatomic返回你的对象可能就不是完整的value。因此,在多线程的环境下原子操作是非常必要的,否则有可能会引起错误的结果。但仅仅使用atomic并不会使得对象线程安全,我们还要为对象线程添加lock来确保线程的安全。

nonatomic的速度要比atomic的快。atomic是Objc使用的一种线程保护技术,这种机制是耗费系统资源的,所以在iPhone这种小型设备上,我们基本上都是使用nonatomic,而对象的线程安全问题则由程序员代码控制。

atomic与nonatomic的本质区别其实也就是在setter方法上的操作不同

nonatomic对象、atomic对象setter和getter方法的实现:

/// nonatomic对象
- (void)setCurrentImage:(UIImage *)currentImage
{
    if (_currentImage != currentImage) {
        [_currentImage release];
        _currentImage = [currentImage retain];
    }
}
- (UIImage *)currentImage
{
    return _currentImage;
}


/// atomic对象
- (void)setCurrentImage:(UIImage *)currentImage
{
    @synchronized(self) {
        if (_currentImage != currentImage) {
            [_currentImage release];
            _currentImage = [currentImage retain];
        }
    }
}

- (UIImage *)currentImage
{
    @synchronized(self) {
        return _currentImage;
    }
}


总结:可以发现几乎所有代码的属性设置都会使用nonatomic,这样能够提高访问性能,在iOS中使用锁机制的开销较大,会损耗性能。

assign

1.这个修饰词是直接赋值的意思 , 整型/浮点型等数据类型都用这个词修饰 .
2.如果没有使用 weak strong retain copy 修饰 , 那么默认就是使用 assign 了.
3.当然其实对象也可以用 assign 修饰 , 只是对象的计数器不会+1 . ( 与 strong 的区别 )
4.如果用来修饰对象属性 , 那么当对象被销毁后指针是不会指向 nil 的 . 所以会出现野指针错误 . ( 与weak的区别 )

weak

weak是弱引用,用weak描述修饰或者所引用对象的计数器不会加一,并且会在引用的对象被释放的时候自动被设置为nil,大大避免了野指针访问坏内存引起崩溃的情况,另外weak还可以用于解决循环引用。

weak原理概括
weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址数组。weak的底层实现的原理是什么?

Runtime维护了一个weak表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash表,Key是所指对象的地址,value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。

为什么value是数组?因为一个对象可能被多个弱引用指针指向

strong

在ARC环境下,只要某一对象被一个strong指针指向,该对象就不会被销毁。如果对象没有被任何strong指针指向,那么就会被销毁。在默认情况下,所有的实例变量和局部变量都是strong类型的。可以说strong类型的指针在行为上跟非ARC下的retain是比较相似的

copy

浅拷贝

只是将对象内存地址多了一个引用,也就是说,拷贝结束之后,两个对象的值不仅相同,而且对象所指的内存地址都是一样的。
深拷贝

拷贝一个对象的具体内容,拷贝结束之后,两个对象的值虽然是相同的,但是指向的内存地址是不同的。两个对象之间也互不影响,互不干扰。

@interface 和 @implementation

在这里插入图片描述
OC中的类必须包括两部分,interface部分和implementation部分,这才是oc中的一个类的完整声明;
OC中将成员变量和成员方法的声明部分放置在interface部分中,包括继承关系,protocal实现关系,都在interface里面的头部进行声明,
然后将实现部分放置在implementation部分中,相当于是将类拆分成声明和实现两部分,这两部分缺一不可,所以在OC中,不妨不要将interface叫做接口,直接叫做类声明部分来得容易理解多了,简而言之,oc中interface是类的一个部分,和implementation共同组成一个完整的类。

- (instancetype)init

这个就是该类的初始化
参考

 (instancetype)init{
    self=[super init];
    if (self) {
        
    }
    NSLog(@"=========in MyView.init 函数里");
    return  self;
}

+和-

+号是static
在这里插入图片描述

self 和 super

self指的是类对象本身;
super是父类对象本身;
self用来调用本类对象的方法;
self关键字先从本类中查找是否有此方法,如果没有,再从父类中调用此方法;
super调用从父类继承下来的方法;
super关键字直接调用父类中定义的方法.

//方法定义

(void)shopping;//不带参数的方法
-(void)goshopping:(float)price; //带参数的方法
-(id)someMethod:(int)someArg someOtherArgName:(int)someOtherArg; //otherParameter是参数的别名(第一个参数的别名省略),在函数调用时方便指定。

new、alloc

Object-C中的方法调用形式采用消息发送的方式,通常调用的形式如:

[someObject someMethod:firstArg someOtherArgName:otherArg];

实例的初始化也采用消息发送的形式,可以简单的调用类型的new方法来获取一个实例对象,简单实例化的方法通常是:

someObject *obj = [someObject new]; //类的实例化

new 方法的实际过程是调用 alloc 和 init 方法,因此如果需要采用自定义的方法来初始化实例,则需要自己重写 init 方法,通常的初始化方式为:

someObject *obj = [[someObject alloc] init]; //采用无参数的init实例化   
someObject *obj = [[someObject alloc] initWithArg:Arg]; //采用参数的实例化 

调用方法

在这里插入图片描述
方法调用的本质就是放对象发送消息

/* new 会调用 init方法 */
People *man = [People new];//类调用new
People *man = [[People alloc] init];//类创建了个对象,调用init

//属性方法调用eat的方式
[man eat];
//类方法调用eat方式
[People eat];
[[People class] eat];

//还有一种不常用的调用方式
[对象/类 performSelector:@selector(eat)];

//底层实现
objc_msgSend(对象/属性, @selector(eat));

//_render对象调用registerModule方法,参数是_lookupDescriptor

[_render registerModule:_lookupDescriptor];

http://www.niftyadmin.cn/n/4928588.html

相关文章

Blender如何给fbx模型添加材质贴图并导出带有材质贴图的模型

推荐&#xff1a;使用 NSDT场景编辑器快速助你搭建可二次编辑的3D应用场景 此教程适合新手用户&#xff0c;专业人士直接可直接绕路。 本教程中介绍了利用Blender建模软件&#xff0c;只需要简单几步就可以为模型添加材质贴&#xff0c;图&#xff0c;并且导出带有材质的模型文…

winrar压缩命令实例

"C:\Program Files\WinRAR\WinRAR.exe" a -ibck -ag -r -m3 -x*\bin\ -x*\obj\ -x*\publish\ -x"abc.csproj.user" abc.rar * a 添加文件到压缩文件夹 -ibck 在后台运行 WinRAR -ag 表示当创建压缩…

ETLCloud+MaxCompute实现云数据仓库的高效实时同步

MaxCompute介绍 MaxCompute是适用于数据分析场景的企业级SaaS&#xff08;Software as a Service&#xff09;模式云数据仓库&#xff0c;以Serverless架构提供快速、全托管的在线数据仓库服务&#xff0c;消除了传统数据平台在资源扩展性和弹性方面的限制&#xff0c;最小化用…

pytest 编写规范

一、pytest 编写规范 1、介绍 pytest是一个非常成熟的全功能的Python测试框架&#xff0c;主要特点有以下几点&#xff1a; 1、简单灵活&#xff0c;容易上手&#xff0c;文档丰富&#xff1b;2、支持参数化&#xff0c;可以细粒度地控制要测试的测试用例&#xff1b;3、能够…

VR全景智慧文旅,用科技助力旅游业振兴

引言&#xff1a; 近年来&#xff0c;科技的迅猛发展将我们带入一个全新的数字化时代&#xff0c;而虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;技术则以其令人惊叹的全新方式&#xff0c;影响着各个领域。其中&#xff0c;旅游业作为人们探索世界、体…

nginx基于源码安装的方式对静态页面、虚拟主机(IP、端口、域名)和日志文件进行配置

一.静态页面 1.更改页面内容 2.更改配置文件 3.测试 二.虚拟主机配置 1.基于IP &#xff08;1&#xff09;在html目录下新建目录存放测试文件 &#xff08;2&#xff09;修改nginx.conf文件&#xff0c;在htttp模块中配置两个server模块分别对应两个IP &#xff08;3&am…

华为新版ENSP PRO模拟器测评:性能表现与功能扩展一览

一、引言 在网络领域不断涌现的新技术和复杂的网络拓扑要求&#xff0c;推动了网络设备模拟器的持续发展和创新。华为作为一家领先的通信技术解决方案提供商&#xff0c;不断致力于为网络工程师和技术从业人员提供更优秀的仿真环境。最近&#xff0c;华为推出了ensp pro模拟器的…

【音视频、chatGpt】h5页面最小化后,再激活后视频停住问题的解决

目录 现象 观察 解决 现象 页面有时候要切换&#xff0c;要最小化&#xff1b;短时间或者几个小时内切换回来&#xff0c;视频可以正常续上&#xff1b;而放置较长时间&#xff0c;几个小时或者一晚上&#xff0c;切换回来后&#xff0c;视频可能卡死 观察 切换页面&#x…