接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。...每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点。写篇博文总结一下OC中的面向对象。...刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点。...简单的说来,便利构造器是为了简化对象的初始化而生的,在之前的博客中也说了一嘴:编程是间接的过程,其实使用便利构造器就是间接的过程。在程序中处处都用到了间接。... 3.创建和使用对象 定义了一个类,一般需要实例化才能使用,当然静态类是不需要实例化就能用的。
在学习iOS App开发中遇到需要计算时间差并格式化输出的需求,没有现成的方法,需要结合NSCalendar和NSDateComponents来实现。...所以干脆把代码封装成一个熟悉的dateDiff方法。...不过这个方法跟VB和sql里的dateDiff还是有点不一样,虽然可以封装成完全一样,不过我觉得直接返回NSDateComponents会更方便,因为所需要的各种单位上的值都包含在其中了。...我是把代码封装到自己的一个工具类KRUtils里作为类方法,使用起来也很方便。
属性“__attribute__”在Objective-C中的应用 关于__attribute__,你可能用的不多,但是一定经常见到,在系统的Foundation框架中,__attribute...8. objc_requires_super 这个属性用来修饰Objective-C中父类的方法,如果子类进行了重写,在重写的方法中没有调用父类方法,则会进行编译器提示。...在实际编程中,很多时候,都是由于子类重写了父类的方法造成不可预知的问题,通过使用这个属性可以有效的对开发者进行提示,例如: ?...10. overloadable 在C语言中,对于相同的函数名,哪怕参数不同,也不能够重复定义。...11. objc_runtime_name 这是一个很有趣的属性,其可以运行时改变Objective-C类的类名,但是不会影响其行为。
一、 lldb 探索isa 定义一个 SHPerson 对象,在 main 函数初始化并断点调试。...第二次打印是class对象的内存分布,并且 0x00000001000080c0(isa) & 0x0000000ffffffff8ULL,得到的内存地址为 0x00000001000080c0,po打印的结果是名为...对比第一次第二次的打印,两个分别为0x00000001000080e8和0x00000001000080c0的内存地址,打印的出来的class对象的名称是一样的。...再对比前两次的打印,发现是不一样的,0x00000001003790f0和0x00000001000080e8、0x00000001000080c0打印出来的class对象名称是不一样的。...发现,00000001000080E8, 00000001000080C0的内存地址不就是上面提到要研究的么,再根据value这一列的值,就可以得知,0x00000001000080e8是类对象, 0x00000001000080c0
Objective-C中的hasPrefix hasPrefix:方法的功能是判断创建的字符串内容是否以某个字符开始,其语法形式如下: -(BOOL)hasPrefix:(NSString*)...该方法的返回值为BOOL,当BOOL为YES或者为1时,则字符串是以某个字符开始;当BOOL为NO或者为0时,则字符串不是以某个字符开始。 ...【示例】以下程序通过使用hasPrefix:方法来判断使用stringWithCString:方法创建的字符串是否以字母B开始,如果是以字母B开始,输出开头为字母B;如果不是,输出开头不为字母B。
一、在不同的内存中创建类的实例对象 1、栈内存中创建实例对象 在上一篇博客 【C++】构造函数分类 ① ( 构造函数分类简介 | 无参构造函数 | 有参构造函数 | 拷贝构造函数 | 代码示例 - 三种类型构造函数定义与调用...栈内存中的 变量 Student s1 ; 这些都是在 栈内存 中创建 类的实例对象 的情况 ; // 调用无参构造函数 Student s1; // 打印 Student s1 实例对象值..., 会自动将栈内存中的实例对象销毁 ; 栈内存中 调用 构造函数 创建的 实例对象 , 不需要关注其内存占用 ; 2、堆内存中创建实例对象 在 栈内存 中声明 类 的 实例对象 方式是 : 该 s1...实例对象存放在栈内存中 , 会占用很大块的栈内存空间 ; Student s1; 在 堆内存 中声明 类 的 实例对象 方式是 : 该 s2 实例对象是存放在堆内存中的 , 栈内存中只占 4 字节的指针变量大小...; Student* s2; 在 C++ 语言中 , 可以使用 new 关键字 , 调用有参构造函数 , 创建类的 实例对象 ; 在下面的 C++ 代码中 , 声明并定义了 MyClass 类 , 该类定义了一个有参构造函数
OC中调用方法某个对象的消息呦两种方式: #1. performanceSelector: withObject: #2. NSInvocation....:@"str1" withObject:@"str2"]; //1.创建方法签名 NSMethodSignature *signature = [ViewController...instanceMethodSignatureForSelector:@selector(printStr1:Str2:Str3:)]; //2.根据方法签名来创建NSInvocation...对象, 在这之前最好先判断下前面创建的signature是否为nil, 方法不存时就是nil NSInvocation *invocation = [NSInvocation invocationWithMethodSignature...:signature]; //设置方法的调用者 invocation.target = self; //设置方法名, 这里一定要跟方法签名类中的方法名一致 invocation.selector
OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象是时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时...等方法的,需要在XCode中进行设置,设置如下: 把Objective-C Automatic Reference Counting 改为NO,即可。 ...(1).先创建一个可变数组对象,在创建一个可变字符串对象; (2).然后往可变数组里添加可变的字符串,观察可变字符串的retainCount的变化。 ...(3).在可变数组中移除一个str,观察retainCount的变化 (4)我们为什么要用可变的字符串呢?稍后会提到为什么。...FomatRetainCount = 3 2014-08-03 20:18:37.240 Memory[2499:303] 传入的变量RetainCount = 3 Objective-C中得
下面详细的介绍Objective-C中的集合类以及每个集合类的用法,学过其他面向对象编程语言的小伙伴们看到OC的集合类会有种莫名的亲切感,理解起来问题不大,可以类比Java中的集合类去学习...在Objective-C中的集合类中主要包括不可变的数组--NSArray, 可变的数组--NSMutableArray, 不可变的字典--NSDictionary, 可变的字典--NSMutableDictionary...一、数组 1.不可变的数组 NSArray 数组是有序对象的集合,用来存储对象的有序列表,在OC中数组中必须存的是对象,不能是基本数据类型,若想存入基本数据类型...NSArray也是OC中的一个对象,使用NSArray也需要进行实例化,前面的博客在类的初始化中提到了便利初始化函数和便利构造器,在NSArray中也少不了这两样东西我们可以通过NSArray的便利初始化函数或者便利构造器进行... 前面不止一次的提到在OC中的集合类中是不能放基本数据类型的,那么我们如何把基本数据类型封装成对象呢?
Objective-C 2.0中的属性机制为我们提供了便捷的获取和设置实例变量的方式,也可以说属性为我们提供了一个默认的设置器和访问器的实现。...@protected :受保护的,该实例变量只能在该类和其子类内访问,父类protected的实例变量在子类中是private的默认是protected; 3.... 在实现文件中我们用@synthesize来实现,用@synthesize来修饰相应的变量就起到类getter 和 setter 的方法实现的作用。...在使用getter和setter方法时有一点要注意:以neme为例,getter方法名为 name, 而setter的名为 setName;在使用getter和setter方法时和普通的函数用法一样 ...,适合基本数据类型 copy(拷贝):把原来的对象拷贝过来,计数器会加一,比如原来对象的地址为0x01 ,拷贝过来的对象的地址为0x02; retain
当时把注意力放在了深浅拷贝的内存地址分析上了,就没太在意,测试做完啦,在回顾的时候发现数组是用下标的方式获取的! 于是就有了个疑问,在OC中这样写也行?...为了更好的偷懒,于是去百度上Google啦一下这是‘ Xcode 4.4中LLVM compiler 4.0’ 引入的新特性(2012年WWDC发布的东西)。... 在之前的博客中我是这样初始化NSArray的: 1 //NSArray的便利初始化 2 NSArray *array1 = [[NSArray alloc] initWithObjects:@...) value; -(id) initWithBool: (BOOL) value; 把基本数据类型包装成对象的便利构造器...= @11.2; NSNumber *c = @('a'); NSLog(@"a = %@, b = %@, c = %@", a, b, c);
在 .net 中,创建一个对象最简单的方法是直接使用 new (), 在实际的项目中,我们可能还会用到反射的方法来创建对象,如果你看过 Microsoft.Extensions.DependencyInjection...的源码,你会发现,为了保证在不同场景中的兼容性和性能,内部使用了多种反射机制。...使用 Activator.CreateInstance 如果你需要创建对象的话,在.NET Framework 和 .NET Core 中正好有一个专门为此设计的静态类,System.Activator...NET Core 中很熟悉的 IOC 容器,Microsoft.Extensions.DependencyInjection,把类型注册到容器中后,然后我们使用 IServiceProvider 来获取对象...这里简单对比了几种创建对象的方法,测试的结果也可能不是特别准确,有兴趣的还可以在 .net framework 上面进行测试,希望对您有用!
defer 所声明的 block 会在当前代码执行退出后被调用。正因为它提供了一种延时调用的方式,所以一般会被用来做资源释放或者销毁,这在某个函数有多个返回出口的时候特别有用。 ?...Objective-C Swift 在OC中也有一个类似的方法:__attribute__((cleanup(...)))...这个方法可以在作用域结束的时候执行指定的方法: { ......*string){ NSLog(@" 打印信息string:%@",*string); } //输出结果为 打印信息string:作用域结束 可以传递一个block,实现类似Swift中的...[066c5c571bd5245b58de320272fa571f.jpg](https://upload-images.jianshu.io/upload_images/2955252-7c9488cfb6e44a8a.jpg
Objective-C中runtime机制的应用 一、初识runtime Objective-C是一种动态语言,所谓动态语言,是在程序执行时动态的确定变量类型,执行变量类型对应的方法的...因此,在Object-C中常用字符串映射类的技巧来动态创建类对象。因为OC的动态语言特性,我们可以通过一些手段,在程序运行时动态的更改对象的变量甚至方法,这就是我们所说的runtime机制。...,首先,在头文件中没有提供任何的方法接口,我们没有办法使用点语法做任何操作,privateOne和PrivateTow两个变量虽然声明在了头文件中,却是私有类型的,通过指针的方式我们虽然可以看到他们,却不能做任何读取修改的操作...int型变量的时候,你或许会遇到一个问题,ARC下,编译器不允许你将int类型的值赋值给id,在buildset中将Objective-C Automatic Reference Counting修改为...五、让我看看你的方法吧 变量通过runtime机制我们可以取到和改变值,那么我们再大胆一点,试试那些私有的方法,首先我们在MyObject类中添加一些方法,我们只实现,并不声明他们: @
在Objective-C中super是指向直接父类的指针,而self是指向本身的指针,self就相当于java中的this指针。...在OC中写类时可以在@implementation中定义哪些在@interface中无相应声明的方法,但这个方法是私有的,仅在类的实现中使用。 ...在Objectiv-C中几乎所有的类都是继承自NSObject类,NSObject类中存在大量功能强大的方法。下面对NSObject类中的各种方法进行试验和介绍: 1....= str1"); } Objective-C中的继承 继承是is-a的关系,比如猫咪是一个动物,那么动物是父类,而猫咪是动物的子类。...2014-07-30 08:38:12.958 HelloOC[483:303] 我是富二代BILL`s son,我超喜欢飙车 Objective-C中的多态 多态简单的说就是对于不同对象响应同一个方法时做出的不同反应
用大白话说就是匿名函数,也就是在函数中可以包含这函数。就是在函数中可以定义匿名函数然后在函数中调用。...学习OC中的block之前也小担心一下,Block在OC中属于高级的部分,心里有又有个疑问:学起来难不难?...小伙伴们如果没大看懂下面的东西,请去上面的博客中进一部的了解一下block. 1.局部变量可变对象和不可变对象在block中的引用 下面会提供一部代码,这部分代码的功能是定义两个局部变量...,一个是可变对象,一个是不可变对象,然后再定义一个Block, 在block中引用两个局部变量。...2.成员变量在block中的使用 成员变量在block中的使用是加上self->a使用的,所以在声明成员变量的时候加不加__block,在成员函数中的代码块中都可以访问修改;
Objective-C中NSArray类的解读 NSArray数组类是Objective-C语言中常用的也是重要的一个类,除了开发中常用到的一些基础功能,NSArray及其相关类中还封装了许多更加强大的功能...:(NSUInteger)index; //初始化方法 - (instancetype)init; //通过C语言风格的数组创建NSArray对象 需要注意,C数组中需要为Objective对象,cnt...参数为C数组的长度 //如果cnt的值小于C数组的长度,则会对C数据进行截取赋值,如果大于则程序会崩溃 - (instancetype)initWithObjects:(const ObjectType...C数组中 objects参数需要为分配好空间的C指针 - (void)getObjects:(ObjectType __unsafe_unretained [])objects range:(NSRange...+ (instancetype)array; //通过一个元素创建数组对象 + (instancetype)arrayWithObject:(ObjectType)anObject; //通过C数组创建数组对象
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上。...一.Objective-C中的类目(Category) 在Objective-C比其他OOP的编程语言多了个类目,在OC中除了用继承来扩充类的功能函数外我们还可以用类目来实现。...二.Objective-C中的延展(Extension) 简单的说匿名类目就是延展,在延展中定义的方法是类私有的方法只能在类的内部调用,定义延展的方式就是把类目中括号中得名字省略掉,括号保留这就是延展...其实在延展中定义的方法不是真正的私有方法和C++, Java中得方法还有所区别,在类初始化的文件中引入相应延展的头文件,其延展对应的方法也是可以访问的。...Memory[1683:303] PrivateFunction1 PS:我是在别的头文件中定义的延展,在.m中被实现 三、Objective中得协议Protocol
还是那句话,第一次接触代理模式是在Java中接触的,在Java中实现代理模式和接口是少不了的。当时学习Spring的时候用到了接口回调,其实就是实现的委托代理模式。...简单的说代理就是把相应的功能交给实现接口的相应的类中来解决。在OC中没有接口该如何实现代理呢?...前面的博客中笔者说提了一句,在OC中的协议和Java中的接口极为相似,都是只声明方法而不去实现,方法的实现在OC中交个遵循协议的类,而在Java中方法的实现交给实现接口的类。...1.在Java中写代理的话,我会先写房屋中介的接口,所以在OC中我们首先也要先声明房屋中介的协议,Protocol中的方法是每个房屋中介必须有的方法,所以在Java中会抽象成接口,而在OC中我们会把他声明为协议...; } @end 3.包租公妥啦以后我们就开始找中介公司啦,中介公司首先得符合我们的协议(在java中就是要实现我们之前的接口),在中介公司中因为要和包租公建立合作关系所以用到了包租公的类
单例模式算是设计模式中比较简单的一种吧,设计模式不是只针对某种编程语言,在C++, Java, PHP等其他OOP语言也有设计模式,笔者初接触设计模式是通过《漫谈设计模式》了解的。...不过在23种设计模式里面单例模式还是算比较好理解的, 那么在OC中又是怎么来表示单例模式的呢?下面会结合着代码,理解一下OC中得单例模式。 ...首先得了解什么是单例模式,用大白话说,单例模式就是在程序中这个类只对应着一个实例,这就是单例模式,单例模式一般用全局静态对象来实现。...1.单例模式一般用全局静态对象来实现,所以我们在SingletonClass.m中定义一个静态全局变量是少不了的 1 2 //定义静态全局变量 static SingletonClass *single...上面是在非ARC模式下得单例模式,那么在ARC模式下我们应如何实现我们的单例模式呢,我们下面就会给出ARC下的单例模式,用下面的方法,因没有重写alloc,copy等方法,通过alloc还是可以给该对象分配一个新对象的
领取专属 10元无门槛券
手把手带您无忧上云