OC对象本质】的更多相关文章

Objective-C的本质 1.我们编写的Objective-C,底层现实都是C/C++,代码生成步骤如下:   2.在OC中的所有面向对象的实现,都是基于C/C++的数据结构实现的 3.将Objective-C代码转换为C\C++代码 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc OC源文件 -o 输出的CPP文件   注:如果需要链接其他框架,使用-framework参数.比如-framework UIKit 一个OC对象在内存中是…
@interface person:NSObject{ @public int _age; } @end @implementation person @end @interface student:person{ @public int _six; } @end @implementation student 有上面两个对象   person继承于NSObject    student 继承于 person   等价于下面的代码 struct NSObject_IMPL { Class isa…
Object-C的底层都是通过C/C++来实现的,所以OC中的对象也会转化成C/C++中的某一个数据结构, 我们在终端里通过指令 xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main_arm64.cpp 将oc代码转化为c++代码,我们可以看到NSObject的底层结构是: struct NSObject_IMPL { Class isa; }; Class是一个指向对象的结构体指针 typedef struct o…
OC对象的本质 平时编写的Object-C代码,底层实现其实都是C/C++代码. 所以Objective-C的面向对象都是基于C/C++的数据结构实现的,OC对象内部可以容纳不同数据类型的数据,因此可以推断OC对象的底层数据结构就是结构体. 为了进一步研究OC对象的本质,我们使用苹果Xcode内置的LLVM编译器前端clang中-rewrite-objc 将我们的OC代码转为C/C++实现. clang -rewrite-objc main.m -o main.cpp 由于不同平台支持的代码肯定…
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环境下编译器不会自动管理CF对象的内存,所以当我们创建了一个CF对象以后就需要我们使用CFRelease将其手动释放,那么CF和OC相互转化的时候该如何管理内存呢?答案就是我们在需要时可以使用__bridge,__bridge_transfer,__bridge_retained,具体介绍和用法如下…
一 建立一个OC的类 完整的写一个函数:需要函数的声明和定义. 完整的写一个类:需要类的声明和实现. 1.类的声明 声明对象的属性和行为 #import <Foundation/Foundation.h> @interface Car : NSObject { @public int speed;//速度 int wheels;//轮子 } - (void) initSpeed:(int)speed withWheels:(int) wheels ; - (void) run; @end 第3…
OC 对象和匿名对象 对象和匿名对象的定义: 当new出一个对象时,如果用一个指针接收这个对象,那么这个指针通常被称为对象. 如果new出的对象,不用指针接收,那么这个对象就称为匿名对象. #import <Foundation/Foundation.h> #import "Iphone.h" #import "Person.h" int main(int argc, const char * argv[]) { //1.通过指针访问对象 Iphone…
1.Foundation框架中提供了很多的集合类如:NSArray,NSMutableArray,NSSet,NSMutableSet,NSDictionary,NSMutableDictionary但是这些类只能存放OC对象类型的数据 2.如果要存放基本数据类型,必须先将基本暑假类型包装成对象类型然后再用集合类进行存储,OC中提供的包装类是NSNumber,NSValue.其中NSNumber继承于NSValue. 3.NSNumber主要针对于基本数据类型的包装,NSValue主要针对结构体…
OC对象使用了ARC,自己主动释放内存,可是CF中的对象没有ARC,必需要手动进行引用计数和内存释放. 两者对象之间的互相转换有三种形式: 1.__bridge: 直接转换,部改变对象的持有状况: id obj = [NSObject new]; cfObject = (_bridge cfObject) obj; //不改变对象持有状况,cf对象不能获得obj的引用. id obc = (__bridge id)cfObject; //但obc是强引用,是被__strong修饰的,必然获得cf…
在C语言中,编程都是面向过程的编程,每一个代码块都严格按照从上至下的顺序执行,在代码块之间同样也是这样, 但是在OC中往往不是这样,OC和C++.java等语言一样,都是面向对象的编程语言,在代码的执行上有很大的跳跃性. OC是C语言的超集,对C语言所有的功能进行了封装,例如,OC对C语言的字符串进行了封装形成了OC的NSString,对字符串进行封装形成了NSArray; OC中可以这样定义一个字符串:NSString *str = @"";在这里对这句话加一个说明,NSString…