在初始化时使用NSObject而不是id是因为NSObject是NSObject的父类,它是一个抽象类,不能被实例化。在Objective-C中,如果需要使用id类型来表示对象,可以在NSObject子类中重写object方法,并返回该类的对象。但是,如果使用NSObject子类来初始化对象,则可以使用id类型来表示对象,而不需要重写object方法并返回该类的对象。因此,在初始化时使用NSObject而不是id可以提高代码的可读性和可维护性。
实际上,将NSString换成其他的类型,例如:NSArray、NSDictionary等等,会发现结果同NSString。 为什么NSString的两次内存地址不一样?基础好的同学可能猜测到原因了。 首先,NSObject是所有类的根类,申明了init方法,看一下NSString的init方法:
类的属性介绍 Swift中属性有多种 存储属性:存储实例的常量和变量 计算属性:通过某种方式计算出来的属性 类属性:与整个类自身相关的属性 存储属性 存储属性是最简单的属性,它作为类实例的一部分,用于存储常量和变量 可以给存储属性提供一个默认值,也可以在初始化方法中对其进行初始化 下面是存储属性的写法 age和name都是存储属性,用来记录该学生的年龄和姓名 chineseScore和mathScore也是存储属性,用来记录该学生的语文分数和数学分数 class Student : NSObject {
在 iOS 里面,无论是 Objective-C 还是 Swift,类(结构体、枚举)的初始化都有一定的规则要求,只不过在 Objective-C 中会比较宽松,如果不按照规则也不会报错,但会存在隐患,而在 Swift 则需要严格按照规则要求代码才能编译通过,极大提高了代码的安全性。
上一篇探究了RAC的销毁机制,既然说到销毁,就不得不说下RAC中的KVO销毁。 在RAC中使用KVO时,仅需一行代码,即可完成对指定对象的属性变化值监听,而且不再需要时刻关注KVO销毁。在这一行代码中,RAC内部是如何自动完成KVO的销毁管理?
重要说明 本文中提到的构造函数,在很多书中有其他的说法,如构造器,构造方法,初始化,初始函数等 本文中提到的析构函数,在很多书中有其他的说法,如反构造器,析构方法,反初始化,反初始函数等 构造函数的介绍 构造函数用于初始化一个类的实例(创建对象) 默认情况下载创建一个类时,必然会调用一个构造函数 即便是没有编写任何构造函数,编译器也会提供一个默认的构造函数 如果是继承自NSObject,可以对父类的构造函数进行重写 默认构造函数 在创建类和结构体的实例时必须为所有的存储属性设置一个合适的初始值,如果不是在定
接触面向对象也有一段时间了,当时是通过C++学习的OOP,后来又接触到了PHP和Java。每种OOP的语言在面向对象上或多或少都会有不同的地方,现在在学习OC的面向对象部分,又感觉到OC面向对象的特点。写篇博文总结一下OC中的面向对象。刚接触OC,用OC中的便利初始化方法和便利构造器有点蹩脚,不过还可以在接受的范围之内,以下的东西可能会对面向对象的特征:抽象,封装,继承等总结的较少一些,主要总结了OC中面向对象的特点。在用到便利构造器的时候,如果之前学习过设计模式的话会好理解一些。 在下面的代码实例
官方对于NSObject的解释如下: The root class of most Objective-C class hierarchies, from which subclasses inherit a basic interface to the runtime system and the ability to behave as Objective-C objects.
面向对象编程之所以成为主流的编程思想和他的继承和多态是分不开的,只要是面向对象语言都支持继承和多态,当然不同的OOP语言之间都有其特点。OC中和Java类似,不支持多重继承,但OOP语言C++就支持多继承,为什么OC不支持多继承稍后将会提到。 说到继承呢,想到了一本书上是引用《大话西游》里的一句话来描述继承的。“人是人他妈生的,妖是妖他妈生的!”,想必里面的唐三藏也学过OOP编程,也许他们师徒四人去西天取什么算法导论呢,漫谈OOP编程啦,数据结构啦等这类的书去啦。人和妖都属于动物类,但各自有各自
Object-C 方法传参机制 : OC 中得参数传递都是值传递, 传入参数的是参数的副本;
我们已经学习了对象的初始化、内存对齐等内容。这篇文章将深入学习探究对象的本质、对isa进行分析。
json与模型的转换框架很多,YYModel 一出,性能吊打同类组件,终于找了些时间观摩了一番,确实收益颇多,写下此文作为分享。
使用构造器来实现构造过程,构造器可以看做是用来创建新实例的特殊方法,与OC的构造器不同,之前是先调用父类的init再写自己的, 但是到了Swift里面, 我们却先初始化自己, 再初始化父类, 是相反的,swift中构造器无需返回值,主要任务是保证新实例在第一次使用前完成正确的初始化
iOS开发者都知道OC里面的内存管理是通过对象的引用计数来管理的,或手动MRC,或自动ARC,有些操作可以让引用计数加1,有些可以减1,一旦一个对象的引用计数为0,就回收内存了。
1、OC是在C语言基础上进行扩展得到的一门面向对象的程序设计语言,它也提供了定义类、成员变量和方法的基本功能。类可以被认为是一种自定义的数据类型,使用它可以定义变量,所有使用类定义的变量都是指针类型的变量,他们将会指向该类的对象。类用于描述客观世界中某一类对象的共同特征,而对象则是类的具体存在。 2、类的定义:OC中定义类分为两个步骤,接口部分和实现部分。OC学习篇之---类的定义 接口部分:定义该类包含的成员变量和方法 实现部分:为该类的方法提供实现 3、接口定义用@interface关键字,用@end表
简介 项目主页:https://github.com/atomicobject/objection 实例下载: https://github.com/ios122/ios122 Objection 是
OC基础总结 重新回过头看这些基础知识,对许多知识点都有新的认识,拥有坚实的基础才能更快的成长。 #improt OC程序的源文件的后缀名是.m m代表message表示消息机制。main 仍然是OC程序的入口和出口,main函数有一个int类型的返回值,代表程序的结束状态。 #import预处理指令,是#inlcude指令的增强版,作用是将文件的内容在预编译的时候拷贝到写指令的地方。 #import做了优化,同一个文件无论#import多少次,都只会包含一次。 简要原理:#import指令在包含文件的时
KVO是Key-Value-Observer的缩写,使用的是观察者模式。底层实现机制都是isa-swizzing,就是在底层调用object_setClass函数,将对象的isa指向的Class偷偷换掉。
个人来说玩玩,还是用swiftui比较好,毕竟写界面的速度快很多,而且还比较直观。
id数据类型可以存储任何类型的对象。可以说,它是一般对象类型。 例如可以声明一个为id类型的变量:
写在前面 ---- 下面的内容,《Obcject-C 高级编程 iOS与OS X 多线程和内存管理》一书是去年看的。那时想总结的,忘记了,趁着最近有时间,再把这本书回炉重新理解再看一遍,对比自己的理解,以及一些Swift内存管理的知识总结的内容,可能文章内容会比较长,就是希望自己能把内存管理这方面的知识真正的仔细总结一下,也方便自己以后回顾: 到底什么是ARC? 在书中一句话总结成了“ARC(Automatic Reference Counting)代表的是自动引用计数,
下面的内容,《Obcject-C 高级编程 iOS与OS X 多线程和内存管理》一书是去年看的。那时想总结的,忘记了,趁着最近有时间,再把这本书回炉重新理解再看一遍,对比自己的理解,以及一些Swift内存管理的知识总结的内容,可能文章内容会比较长,就是希望自己能把内存管理这方面的知识真正的仔细总结一下,也方便自己以后回顾:
可以看出,alloc类方法是开辟了一块内存,生成了一个实例对象,并且对实例对象进行了初始化
iOS中的mapKit框架对国际化的支持非常出色。在前些篇博客中,对这个地图框架的基础用法和标注与覆盖物的添加进行了详细的介绍,这篇博客将介绍两个更加实用的功能的开发:线路导航与兴趣点搜索。前几篇博客的链接如下:
内存管理的文章网上太多了,本文只是简单的聊聊内存管理 让你加深内存管理的理解。 了解内存管理首先你需要思考几个问题 1.为什么需要进行内存管理? 2.内管管理的范围? 3.内存管理的原则? 4.对象什么时候会被释放? 5.怎么对象已经没有被引用了? 6.如何判断对象已经释放了? 7.谈谈ARC
在面向对象编程中,我们每天都在创建对象,用对象描述着整个世界,然而对象是如何从孕育到销毁的呢?
引用是iOS内存管理中的重要知识点,总所周知,iOS对象的内存管理是使用引用计数来表示的。一个对象只有在它的所有强引用都被释放后才能被回收。因此,一个对象的生命周期取决于其强引用的所有者。在某些情况下,这种行为可能并不理想。您可能想要引用一个对象而不妨碍对象本身的回收。对于这种情况,您可以获取一个“弱”引用。弱引用是通过存储一个指向对象的指针创建的,而不是保留对象。
Flutter 渲染引擎在 iOS 上支持三种渲染方式,分别是纯软件(CPU),Metal 和 GL。其中纯软件的方式仅限于特定的构建,需要在编译时开启 TARGET_IPHONE_SIMULATOR 宏,应该是用于在模拟器上的测试,实机运行只会使用 Metal 和 GL。Flutter 会在运行时先判断是否能够使用 Metal,如果设备不支持,才会降级到 GL。iOS 10 以上的版本默认使用 Metal,GL 只用于兼容 iOS 9 的老旧设备。
原文作者:溪浣双鲤 https://www.jianshu.com/p/51758229b4a5
上篇博客我跟大家分享了如何在iOS系统中使用原生框架获取步数,又是大半个月过去了,运动模块的全部功能也总算完成了,也打算有始有终的把如何做一个跑步类App跟大家分享了。
我第一次开始重视Objective-C Runtime是从2014年11月1日,@唐巧老师在微博上发的一条微博开始。
利用上周的业余时间把这篇规范整理了出来,我会将这篇规范作为我们iOS团队的代码规范,并且还会根据读者的反馈,项目的实践和研究的深入做不定时更新,还希望各位朋友看了多多指正和批评。
花了一个月的时间结合几篇博客和书籍写了这套 iOS 代码规范(具体参考底部的参考文献部分)。这套代码规范除了有仅适用于 iOS 开发的部分,还有其他的比较通用性的规范(控制语句,注释等等)。
Scanner继承自NSObject, 遵循NSCopying协议。是一个用于扫描指定字符串的抽象类 初始化时指定需要扫描的String,可以设置需要跳过的字符集合 调用scan方法,scanner会按要求扫描出需要提取的字符串
但是RACKVO只是用了非常简单的一段代码就实现了以上的这三个步骤,去掉了胶水代码,真正的做到了面向业务开发,那它是怎么实现的呢,接下来我们来一层层分析
继承是面向对象的三个基本特征(封装,继承,多态)之一,Objective-C语法中,是单继承。而多继承可以看作是单继承的扩展。所谓多继承是指派生类具有多个基类,派生类与每个基类之间的关系仍可看作是一个单继承。我们可以利用NSProxy的特性来模拟多继承
原文地址:https://juejin.im/post/5cb067676fb9a0688360f987”
单例可能是 iOS 开发者最熟悉设计模式之一了。 我们的项目里头也使用了很多单例😓。 最近为了解决项目中单例的 bug 而花费了两天多的时间,发现用 ObjC 写好一个单例真的不容易! V1.0 可能有很多人不服气,单例么, 有什么难的, 一个简单的 dispatch_once 不就解决了么! 比如下边的代码: @implementation SingletonClass + (instancetype)sharedInstance { static SingletonClass *instanc
KVO 是 Objective-C 对 观察者模式(Observer Pattern)的实现。当被观察对象的某个属性发生更改时,观察者对象会获得通知。有意思的是,你不需要给被观察的对象添加任何额外代码,就能使用 KVO 。这是怎么做到的?
你要知道的KVC、KVO、Delegate、Notification都在这里 转载请注明出处 https://cloud.tencent.com/developer/user/1605429 本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。 KVC 使用方法详解及底层实现 KVO 正确使用姿势进阶及底层实现 Protocol与Dele
说明:这个Objective-C专题,是学习iOS开发的前奏,也为了让有面向对象语言开发经验的程序员,能够快速上手Objective-C。如果你还没有编程经验,或者对Objective-C、iOS开发不感兴趣,请忽略。学习本专题之前,建议先学习C语言专题。 OC是一门面向对象的语言,因此它也有类、对象、静态\动态方法、成员变量的概念。这讲就来创建第一个OC的类。 一、语法简介 1.类 在Java中,我们用1个.java文件就可以描述清楚一个类;在OC中,一般用2个文件来描述一个类: 1> .h:类的声明文件
KVO(key-value observe)是在KVC的基础上实现的一种用于监听属性变化的设计模式;如果对某个类的某个属性设置了KVO,那么当这个属性发生变化时,就会触发监听方法,从而知道属性变化了。如果本类一个属性的改变会影响到其他多个属性的变化,我们也会经常自己重写这个属性的set方法,用来监听他的变化,但是如果不是本类的属性,我们就没办法重写其set方法了,这个时候KVO就可以上场了,其实KVO本质上也是重写set方法,而整个过程依赖于runtime才能实现。
为什么不要在init和dealloc方法中调用getter和setter: Apple在Mac与iOS中关于内存管理的开发文档中,有一节的题目为:“Don’tUse Accessor Methods in Initializer Methods and dealloc”,文中说:“Theonly places you shouldn’t use accessor methods to set an instancevariable are in initializer methods anddealloc.”但是并没有解释为什么。网上搜索了几篇国内国外的文章和一些大V的博客,希望此文能详尽大家的疑惑,未尽之处请留言指正。
京喜APP最早在2019年引入了Swift,使用Swift完成了第一个订单模块的开发。之后一年多我们持续在团队/公司内部推广和普及Swift,目前Swift已经支撑了70%+以上的业务。通过使用Swift提高了团队内同学的开发效率,同时也带来了质量的提升,目前来自Swift的Crash的占比不到1%。在这过程中不断的学习/实践,团队内的Code Review,也对如何使用Swift来提高代码质量有更深的理解。
继上一篇《Effective Objective-C 》超级干货三部曲(二):规范篇之后,本篇即是三部曲的第三篇:技巧篇。本篇作为三部曲的最终篇,归纳讲解的是本书中关于Objective-C开发的技巧性知识。
总结了Effective Objective-C之后,还想读一本进阶的iOS书,毫不犹豫选中了《Objective-C 高级编程》:
简介 Kiwi 是一个适用于iOS开发的行为驱动测试框架,旨在提供一个足够简单易用的BDD库. 项目主页: https://github.com/kiwi-bdd/Kiwi 示例下载: https:/
这篇文章是论MVVM伪框架结构和MVC中M的实现机制的姊妹篇。在前面的文章中更多介绍的是一些理论性质的东西,一些小伙伴在评论中也说希望有一些具体设计实践的例子,以及对一些问题进行了更加深入的交流讨论,因此准备了这篇文章。这篇文章将更多的介绍如何来进行模型层构建。
weak表其实是一个hash表,Key是所指对象的地址,Value是weak指针的地址数组,weak是弱引用,所引用对象的计数器不会+1,并在引用对象被释放的时候自动被设置为nil。通常用于解决循环引用问题。
领取专属 10元无门槛券
手把手带您无忧上云