
正文
ios开发基础知识,iOS开发指南
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
ios游戏开发需要哪些知识
基础是要过关的,oop、多线程、db、基本算法或数据结构是必须的。
还要熟练掌握Objective-C语言,C/C++语言;3.熟悉Cocoa开发框架,包括UI、网络等方面,熟悉IOS开发工具和相关开发测试工具的使用,掌握常用的数据结构与常用算法,较好的逻辑思维分析和表达和沟通能力,要有一定的自学能力,较强的团队协作意识。
更多关于ios游戏开发需要哪些知识,进入:查看更多内容
相关问答
Q1: iOS 基础知识点
一、属性修饰符
读写属性: (readwrite/readonly)
语义特性:(内存有关):(assign/retain/copy)
原子特性:(和线程安全有关): (atomicit/nonatomic)
readonly:只读,属性只会生成getter方法,不会生成setter.
readwrite:既可读又可写.属性自动生成setter和getter方法.(默认的读写特性)
getter= 方法名:指定生成getter方法时的方法名.
setter= 方法名:指定生成setter方法时的方法名.
assign: 默认类型,setter方法直接赋值,而不进行retain操作,也可以只针对对象,只是做简单的赋值操作. 默认的语义特性.
retain: 针对于对象类型,setter方法对参数进行release旧值,再retain新值。
copy: setter方法进行Copy操作,与retain一样, 针对于对象类型,会拷贝一个新的对象,将新的对象的引用计数加1
nonatomic: 禁止多线程,变量保护,提高性能
atomic:原子特性,保证线程安全.系统默认的原子特性.
weak:指针指向的地址一旦被释放,这些指针都将被赋值为nil。这样的好处能有效的防止野指针。消除循环引用 。
二、 @dynamic 关键字
@dynamic dynamicStr; // 告诉编译器,不自定生成getter和setter方法,避免编译期间产生警告,然后由自己实现存取方法。
三、 @synthesize 关键字
@synthesize strongStr = _strongStr; // 可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问, 编译器期间,让编译器自动生成getter/setter方法 当有自定义的存或取方法时,自定义会屏蔽自动生成该方法
四、重定义setter方法getter方法
// 重定义setter方法
// 重定义getter方法
五、不可变字符串 NSString
// 运行log日志:
2021-03-11 17:30:08.112340+0800 TestObject-C[93449:1623723] temp1: 不可变字符串, 0x10df9e778
2021-03-11 17:30:08.112529+0800 TestObject-C[93449:1623723] str: 不可变字符串, 0x10df9e778
2021-03-11 17:30:08.112610+0800 TestObject-C****[****93449:1623723****]**** strongStr: ****不可变字符串****, 0x10df9e778
六、可变字符串 NSMutableString
// 一、将不可变字符串赋值给可变字符串对象。
// 赋值可变字符串对象后,对象仍然是不可变对象
2021-03-11 17:30:08.114159+0800 TestObject-C[93449:1623723] mTemp: 不 可变字符串1, 0x10df9e878
2021-03-11 17:30:08.114393+0800 TestObject-C[93449:1623723] mCopyStr: 不 可变字符串1, 0x10df9e878
2021-03-11 17:30:08.114697+0800 TestObject-C****[****93449:1623723****]**** mStrongStr: 不 可变字符串****1, 0x10df9e878
// 一、将可变字符串赋值给可变字符串对象。
2021-03-11 19:38:34.493763+0800 TestObject-C[95274:1718783] mTemp2: 可变字符串2, 0x600002710ea0, __NSCFString
2021-03-11 19:38:34.493923+0800 TestObject-C[95274:1718783] mCopyStr: 可变字符串2, 0x6000027110e0, __NSCFString
2021-03-11 19:38:34.494037+0800 TestObject-C****[****95274:1718783****]**** mStrongStr: ****可变字符串****2, 0x600002710ea0, __NSCFString
2021-03-11 19:38:34.494422+0800 TestObject-C[95274:1718783] mTemp2: 可变字符串211, 0x600002710ea0, __NSCFString
2021-03-11 19:38:34.494697+0800 TestObject-C[95274:1718783] mCopyStr: 可变字符串2, 0x6000027110e0, __NSCFString
2021-03-11 19:38:34.494903+0800 TestObject-C****[****95274:1718783****]**** mStrongStr: ****可变字符串****211, 0x600002710ea0, __NSCFString
七、富文本字符串 NSMutableAttributedString
2021-03-11 19:34:52.041131+0800 TestObject-C[95207:1715249] attriStr: 我是富文本我是富文本我是富文本我是富文本, 0x600000a5bc00, NSConcreteMutableAttributedString
2021-03-11 19:34:52.041307+0800 TestObject-C[95207:1715249] mutableAttri: 我是富文本我是富文本我是富文本我是富文本, 0x600000a5be40, NSConcreteAttributedString
2021-03-11 19:34:52.041425+0800 TestObject-C****[****95207:1715249****]**** mutableStrongAttri: ****我是富文本我是富文本我是富文本我是富文本****, 0x600000a5bc00, NSConcreteMutableAttributedString
2021-03-11 19:34:52.041943+0800 TestObject-C[95207:1715249] attriStr: 我是富文本我是富文本我是富文本我是富文本---我是新添加的, 0x600000a5bc00, NSConcreteMutableAttributedString
2021-03-11 19:34:52.042281+0800 TestObject-C****[****95207:1715249****]**** mutableStrongAttri: ****我是富文本我是富文本我是富文本我是富文本****---****我是新添加的****, 0x600000a5bc00, NSConcreteMutableAttributedString
八、不可变数组NSArray
//一、 不可变数组赋值NSArray的对象
2021-03-11 19:04:42.636207+0800 TestObject-C[94739:1689350] arr: (1, 2,
3), 0x600001d5c8d0
2021-03-11 19:04:42.636411+0800 TestObject-C[94739:1689350] persons: ( 1, 2, 3), 0x600001d5c8d0
2021-03-11 19:04:42.636538+0800 TestObject-C[94739:1689350] students: (1, 2, 3), 0x600001d5c8d0
2021-03-11 19:04:42.636646+0800 TestObject-C[94739:1689350] arr: (1, 2, 3), 0x600001d5c8d0
2021-03-11 19:04:42.636767+0800 TestObject-C[94739:1689350] students: (1, 2,3), 0x600001d5c8d0, __NSArrayI
// 二、不可变数组赋值给NSMutableArray的对象
**2021-03-11 19:15:59.046728+0800 TestObject-C[94934:1699039] arr: (1,2,3), 0x600002f6c000
2021-03-11 19:15:59.046878+0800 TestObject-C[94934:1699039] cars: (1, 2,3), 0x600002f6c000, __NSArrayI2021-03-11 19:15:59.046982+0800 TestObject-C[94934:1699039] dogs: (1,2,3), 0x600002f6c000, __NSArrayI
九、可变数组 NSMutableArray
2021-03-11 19:22:39.183745+0800 TestObject-C[95044:1705082] arr2: (2,4,10,12), 0x600000fefea0
2021-03-11 19:22:39.184067+0800 TestObject-C[95044:1705082] cars: (2,4,10), 0x600000fef240, __NSArrayI
**2021-03-11 19:22:39.184272+0800 TestObject-C[95044:1705082] dogs: (2,4,10,12), 0x600000fefea0, __NSArrayM
十、不可变字典 NSDictionary
// 不可变数组赋值给NSDictionary对象
2021-03-11 19:25:32.789615+0800 TestObject-C[95102:1708378] dic: {key1 = 1;key2 = value;}, 0x6000028799c0**
2021-03-11 19:25:32.789801+0800 TestObject-C[95102:1708378] personDic: { key1 = 1;key2 = value;}, 0x6000028799c0, __NSDictionaryI
2021-03-11 19:25:32.789919+0800 TestObject-C[95102:1708378] studentDic: { key1 = 1;key2 = value;}, 0x6000028799c0, __NSDictionaryI
十一、可变字典 NSMutableDictionary
2021-03-11 19:59:28.739545+0800 TestObject-C[96373:1735182] mDic: { key1 = 10;key2 = value2;}, 0x6000017f0700, __NSDictionaryM
**2021-03-11 19:59:28.740177+0800 TestObject-C[96373:1735182] carDic: {key1 = 10;key2 = value2;}, 0x6000017f07a0, __NSFrozenDictionaryM
2021-03-11 19:59:28.740359+0800 TestObject-C[96373:1735182] dogDic: { key1 = 10;key2 = value2;}, 0x6000017f0700, __NSDictionaryM
2021-03-11 20:05:24.028840+0800 TestObject-C[96469:1740141] mDic: {key1 = 10; key2 = value2;key4 = value4;}, 0x6000011bd7e0, __NSDictionaryM
2021-03-11 20:05:24.028930+0800 TestObject-C[96469:1740141] carDic: { key1 = 10; key2 = value2;}, 0x6000011bd820, __NSFrozenDictionaryM
2021-03-11 20:05:24.029028+0800 TestObject-C[96469:1740141] dogDic: {key1 = 10;key2 = value2;key4 = value4;}, 0x6000011bd7e0, __NSDictionaryM
十二、不可变集合 NSSet
// 一、不可变NSSet赋值给 NSSet对象
2021-03-11 20:09:49.418694+0800 TestObject-C[96545:1744249] set: {( 1,2,3)}, 0x600003fd2e80, __NSSetI
2021-03-11 20:09:49.418826+0800 TestObject-C[96545:1744249] personSet: {(1,2,3)}, 0x600003fd2e80, __NSSetI
2021-03-11 20:09:49.418914+0800 TestObject-C[96545:1744249] studentSet: {(1,2,3)}, 0x600003fd2e80, __NSSetI
// 二、不可变NSSet赋值给 NSMutableSet对象
2021-03-11 20:09:49.419281+0800 TestObject-C[96545:1744249] carSet: {(1,2,3)}, 0x600003fd2e80, __NSSetI
2021-03-11 20:09:49.419362+0800 TestObject-C[96545:1744249] dogSet: {(1, 2,3)}, 0x600003fd2e80, __NSSetI
十三、可变集合 NSMutableSet
2021-03-11 20:18:06.896997+0800 TestObject-C[96705:1752827] mSet: {(3,1,2,5)}, 0x600001e0a700, __NSSetM
2021-03-11 20:18:06.897218+0800 TestObject-C[96705:1752827] carSet: {( 1,2,3)}, 0x600001014bd0, __NSSetI
2021-03-11 20:18:06.897340+0800 TestObject-C[96705:1752827] dogSet: {(3,1,2, 5)}, 0x600001e0a700, __NSSetM
Q2: 零基础如何学习ios开发?
oc已全部翻译完成视频总4个视频免费下载
链接:
提取码:64s9
oc已全部翻译完成视频 总4个视频|OC教程04:速建+讲解.mp4|OC教程03:如何给机器人添加纹理与着色.mp4|OC教程02:场景管理.mp4|OC教程01:涂鸦的投射原理与应用.mp4
Q3: iOS基础知识 (一)
Runtime是iOS核心运行机制之一,iOS App加载库、加载类、执行方法调用,全靠Runtime,这一块的知识个人认为是最基础的,基本面试必问。
1)iOS调用一个方法时,实际上会调用objc_msgSend(receiver, selector, arg1, arg2, ...),该方法第一个参数是消息接收者,第二个参数是方法名,剩下的参数是方法参数;
2)iOS调用一个方法时,会先去该类的方法缓存列表里面查找是否有该方法,如果有直接调用,否则走第3)步;
3)去该类的方法列表里面找,找到直接调用,把方法加入缓存列表;否则走第4)步;
4)沿着该类的继承链继续查找,找到直接调用,把方法加入缓存列表;否则消息转发流程;
很多面试者大体知道这个流程,但是有关细节不是特别清楚。
如果在消息发送阶段没有找到方法,iOS会走消息转发流程,流程图如下所示:
1)动态消息解析。检查是否重写了resolveInstanceMethod 方法,如果返回YES则可以通过class_addMethod 动态添加方法来处理消息,否则走第2)步;
2)消息target转发。forwardingTargetForSelector 用于指定哪个对象来响应消息。如果返回nil 则走第3)步;
3)消息转发。这步调用 methodSignatureForSelector 进行方法签名,这可以将函数的参数类型和返回值封装。如果返回 nil 执行第四步;否则返回 methodSignature,则进入 forwardInvocation ,在这里可以修改实现方法,修改响应对象等,如果方法调用成功,则结束。否则执行第4)步;
4)报错 unrecognized selector sent to instance。
很多人知道这四步,但是笔者一般会问:
+load在main函数之前被Runtime调用,+initialize 方法是在类或它的子类收到第一条消息之前被调用的,这里所指的消息包括实例方法和类方法的调用。
笔者在面试过程中发现很多人对于load与initialize在分类、继承链的调用顺序不清楚。对怎么保证初始化安全也不清楚
RunLoop苹果原理图
图中展现了 Runloop 在线程中的作用:从 input source 和 timer source 接受事件,然后在线程中处理事件。
两个都是 Runloop 事件的来源,其中 Input Source 又可以分为三类
因为定时器默认是运行在NSDefaultRunLoopMode,在列表滚动时候,主线程会切换到UITrackingRunLoopMode,导致定时器回调得不到执行。
有两种解决方案:
iOS 检测到手指触摸 (Touch) 操作时会将其打包成一个 UIEvent 对象,并放入当前活动Application的事件队列,UIApplication 会从事件队列中取出触摸事件并传递给单例的 UIWindow 来处理,UIWindow 对象首先会使用 hitTest:withEvent:方法寻找此次Touch操作初始点所在的视图(View),即需要将触摸事件传递给其处理的视图,这个过程称之为 hit-test view。
hitTest:withEvent:方法的处理流程如下:
iOS的事件分发机制是为了找到第一响应者,事件的处理机制叫做响应者链原理。
所有事件响应的类都是 UIResponder 的子类,响应者链是一个由不同对象组成的层次结构,其中的每个对象将依次获得响应事件消息的机会。当发生事件时,事件首先被发送给第一响应者,第一响应者往往是事件发生的视图,也就是用户触摸屏幕的地方。事件将沿着响应者链一直向下传递,直到被接受并做出处理。一般来说,第一响应者是个视图对象或者其子类对象,当其被触摸后事件被交由它处理,如果它不处理,就传递给它的父视图(superview)对象(如果存在)处理,如果没有父视图,事件就会被传递给它的视图控制器对象 ViewController(如果存在),接下来会沿着顶层视图(top view)到窗口(UIWindow 对象)再到程序(UIApplication 对象)。如果整个过程都没有响应这个事件,该事件就被丢弃。一般情况下,在响应者链中只要由对象处理事件,事件就停止传递。
一个典型的事件响应路线如下:
First Responser -- 父视图--The Window -- The Application -- nil(丢弃)
我们可以通过 [responder nextResponder] 找到当前 responder 的下一个 responder,持续这个过程到最后会找到 UIApplication 对象。
1) 在VC的cellForRowAtIndexPath方法中cell的block直接引用self或者直接以_形式引用属性造成循环引用。
解决方案:把self改成weakSelf;
2)在cell的block中直接引用VC的成员变量造成循环引用。
解决方案有两种:
3)delegate属性声明为strong,造成循环引用。
解决方案:delegate声明为weak
4)在block里面调用super,造成循环引用。
解决方案,封装goback调用
5)block声明为strong
解决方案:声明为copy
6)NSTimer使用后不invalidate造成循环引用。
解决方案:
考察viewDidLoad、viewWillAppear、ViewDidAppear等方法的执行顺序。
假设现在有一个 AViewController(简称 Avc) 和 BViewController (简称 Bvc),通过 navigationController 的push 实现 Avc 到 Bvc 的跳转,调用顺序如下:
1、A viewDidLoad
2、A viewWillAppear
3、A viewDidAppear
4、B viewDidLoad
5、A viewWillDisappear
6、B viewWillAppear
7、A viewDidDisappear
8、B viewDidAppear
如果再从 Bvc 跳回 Avc,调用顺序如下:
1、B viewWillDisappear
2、A viewWillAppear
3、B viewDidDisappear
4、A viewDidAppear
如果你正在跳槽或者正准备跳槽不妨动动小手,添加一下咱们的交流群 931542608 来获取一份详细的大厂面试资料为你的跳槽多添一份保障。
Q4: iOS开发之基础篇(5)—— NSNumber、NSValue
Xcode 8.2.1
前文说过,NSArray和NSDictionary只能存入OC对象。不信我们可以做个试验:将一个int类型或者是NSInteger放入NSMutableArray里面。(NSInteger和int的差别:NSInteger会根据系统的位数32or64,自动选择int的最大数值int or long,这样我们就不用考虑设备是32位还是64位系统)
这样是会编译出错的,存入不成功。
那怎么办呢?所以,我们需要将int或者NSInteger类型转换成NSNumber(OC对象),然后再存入NSArray中。
NSNumber可以转换一系列的基础数字类型(char、int、float、long、bool等等),还提供了一个compare方法来将NSNumber对象进行数值排序。
我们来看看NSNumber有哪些要掌握的知识点:
运行结果如下:
之所以把NSNumber和NSValue放到同一篇,是因为NSNumber是NSValue的子类,NSValue除了能够包装NSNumber能够包装的基础数字类型外,还能够包装系统框架提供的CGRect/CGPoint/CGSize等数据结构,也可以是自己定义的struct。最终也能放入数组。
同样,我们来看看它的应用:
运行结果:







