为游戏接入ios sdk的oc学习笔记
开发手机游戏,需要接入ios的sdk,截止2021年7月23日虽然swift已经推出一些年头,但对于大部分的渠道sdk,还是oc的代码。
oc不仅仅用来开发ios,还是mac上的app开发语言
从新手到入门
新手教程
object c的简写是objc,很多类都是NS开头,这是乔布斯离开苹果后自己创立的NeSt公司的简写
基础知识:.mm是objc++的代码,.cpp是C++的代码,.m是objc的代码,.h是头文件,只写接口
objc语言新手教程《Objective-C基础教程:1天玩转Objective-C语法》,在1天看完后心里大概有个语言的概念
对objc有一个比较全面的认识之后,可以看这篇《Objective-C 简介》
在windwos上运行objc,会是比较麻烦的一件事,而且没有优秀的IDE,不建议
先写定义,再写实现,放在两个文件中,也可以通过xcode新建cocos则会创建出这两个文件来
xcode编写objc的感受
在xcode可以新建控制台项目,用来学习objc语言,还是非常合适的。在编写代码的过程中,对于代码中的编译错误,xcode的提示还是很全面并且很及时,但是他没有像rider那样按下Alt+Enter就可以修复一些明显的代码错误。
一些疑问
是不是引用类型,创建出来的实例都要加上*? 比如:
Person *ZhangSan=[[Person alloc] init];//创建一个对象
[ZhangSan displayWithDriveHours:10]; //调用对象的方法,传入10
Q:为什么C#引用其它的文件,不需要using,而c++和lua,python都需要import?
A:C#是把同一个namespace编译到一个dll,而lua,python是单个文件,c++还在学习中
Q:id动态类型,是不是从当前文件中查看方法?是从当前类型中去查找方法
Q:NSArray中,初始值是@"1",@"2",但是打印出来却是整形,直接取值出来也是整形,这点和C#的差别比较大,是怎么实现的?
Q:sdkxxx.framework中有个info.plist,然后sdk的最上层也有一个info.plist,这两个是和安卓中的manfest一样,打包时会自动合并?
oc语言checklist
开发工具AppCode,XCode
.h和.m都是以@end结束
类方法+,可以理解为C#中的static,对象方法-就是实例的方法
oc中的发送消息,就是其它语言中的调用方法
oc中对象的初始化(分配内存),[[Class alloc] init],对应C#的new Class()
oc中方法的调用格式[实例对象 方法名],对应C#中的.
oc中方法的调用格式[实例对象 方法名:参数1值 参数1名称],对应C#中的.
只有一个参数的情况:[ZhangSan displayWithDriveHours:10];
“^”是block代码块的标志,可以理解为局部函数,或C#中的Action
+类方法(static),-对象方法(普通方法)
接入sdk时,用到很多的block代码块的方式来写代码
编译方式不一样,C#是编译到程序集(dll),oc是静态链接库(需要补充知识)
oc的数据结构
oc中基础框架的代码是在Foundation.h中导入了其它头文件(.h),比如数组,字典,字符串,文件类,日期类,线程类等一系列编程的基础元件。
NString* str = @"";
BOOL
NSArray 不允许存int ,float ,nil,nil就是结束,那么怎样存整形数组??
NSMutableArray 可变类型的数组,有增加和删除方法
NSDictionary 字典,oc中的基础类型都不能当键和值?必须要把它们转成对象才可以使用,那这样不科学啊C#中没有这个限制
字典来看,是先添加value再添加key
NSMutableDictionary可变类型字典
NSNumber类实现的功能是C语言中的基本数据类型和OC对象相互转换,转换之后就可以把int放到NSArray中了
用的最多的数据类型
NString,NSDictionary ,NSArray,NSNumber(包裹类,数据类型转换)
语言特性
通知addObserver:self 添加监听,可以理解为C#中的Action/event,移除事件removeObserver。从sdk代码来看 return self这个返回结果不是必须的
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(对象) name:@"事件名?" object:nil]
forKey, valueForKey
KVO:Key-Value-Observer,可以理解为当键值发生改变时的事件,这个功能在C#中通过事件系统就可以实现。
NSPredicate 谓词(过滤器),有点像C#中的Linq用来写条件筛选数据
plist文件,它的全称是:Property List。这种文件保存数据的特点就是只能保存:NSString、NSArray、NSData、NSDate、NSDictionary、BOOL、NSNumber这几种数据类型。
方法创建和调用
文档:http://c.biancheng.net/cpp/html/3196.html
//类方法的创建:
+(int)personWithA1:(float)a1 andA2:(NSString*)a2; //a1,a2分别代表两个参数
//对象方法的创建:
-(int)personWithA1:(float)a1 andA2:(NSString*)a2;
//“+”“-”号的不同是区分它们的一个标志,两种创建类方法不同之处的重点是调用对象的不同:
//调用类方法
[Person personWithA1:2 andA2:@"类方法"];//调用对象是类名
//调用对象方法
Person * obj1=[[Person alloc]init];
[obj1 personWithA1:1 andA2:@"对象方法"];//调用对象是类对象
return 0;
“^”block代码块
可以理解为是C#中的Action
普通的函数定义
-(void)displayWithDriveHours:(int)hours{
self.car.driveHours+=hours;
}
^block代码块的定义
void (^helloWorld)(void);
helloWorld=^(void){
NSLog(@"Hello World!");
};
helloWorld();
第1行(^helloWorld)这个是代码块的声音,第1行前面的void是返回类型,后面的(void)是参数,如果是int则写成(int arg1,int arg2)
第2行开始是代码块的实现,^必须要有
block实现和定义写在一起的情况
#import <Foundation/Foundation.h>
int number=10;
int main(int argc, const char * argv[]) {
__block int i=10;
void(^block)()=^{
NSLog(@"The i is :%d",i);
NSLog(@"The number is :%d",number);
i++;
number++;
};
block();
NSLog(@"The i is :%d",i);
NSLog(@"The number is :%d",number);
return 0;
}
接入ios sdk未用到的知识
typedef 用于简化block代码块,未用到
writeToFile:path 文件读写,未用到
@protocol 协议,没有父类,有点像C#的接口,未用到 http://c.biancheng.net/cpp/html/3204.html
类别,未用到,不太像C#中的抽象类,有点像扩展类partical?,它可以只给父类添加方法而不影响子类 http://c.biancheng.net/cpp/html/3203.html
NSUserDefaults 用户默认设置,可以用来保存用户登录的用户名,查看SDK中不包含这个
内存管理
自动引用计数:ios和mac两种开发都支持。(Xcode4.2之后才可以使用,简称:ARC(Automatic Reference Counting),ARC是Mac OS X 10.7和iOS 5 引入的新的内存管理方式)
他人学习资料
C#中方法调用是静态的,绑定发生在编译时 (暂时忽略动态编译)。Objective-C 消息则在运行时动态绑定对象,而非编译时。这意味着你可以发送任意定义好的消息给对象,编译器都不会报错。错误会在运行时抛出
这个需要查看C#的IL代码,再做评论
unity与ios交互
在unity中函数定义,生成xcode工程时,会生成对应的空方法, 在oc中写方法的实现,可查看《Unity接入IOS SDK笔记》
开发ios插件文档:https://docs.unity3d.com/cn/current/Manual/PluginsForIOS.html
oc中调用unity的方法UnitySendMessage(gameobject名字,方法名,参数)
为游戏接入ios sdk的oc学习笔记的更多相关文章
- IOS开发-OC学习-常用功能代码片段整理
IOS开发-OC学习-常用功能代码片段整理 IOS开发中会频繁用到一些代码段,用来实现一些固定的功能.比如在文本框中输入完后要让键盘收回,这个需要用一个简单的让文本框失去第一响应者的身份来完成.或者是 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
上一节学习了使用Cocos2d-x播放音乐的方法,但是那种方法一般只适合于播放较大的音乐,而一般比较短小的音乐(如游戏中的打斗.按键音效等)则要通过playEffect来播放.本节使用该方法以及之前学 ...
- 《Cocos2d-x游戏开发实战精解》学习笔记3--在Cocos2d-x中播放声音
<Cocos2d-x游戏开发实战精解>学习笔记1--在Cocos2d中显示图像 <Cocos2d-x游戏开发实战精解>学习笔记2--在Cocos2d-x中显示一行文字 之前的内 ...
- cocos2dx游戏开发——别踩白块学习笔记(二)——经典模式的实现
一.创建GameScene以及GameLayer 就是简单创建一个Scene而已,在此就不多说啦~,可以参照我的打飞机的学习笔记(2). 二.添加一个开始栏 很简单,就是调用Block中的create ...
- cocos2dx游戏开发——捕鱼达人mini版学习笔记(二)——MainMenu的搭建
一.创建文件~ MainMenuScene.h MainMenuScene.cpp MainMenuLayer.h MainMenuLayer.cpp 那个场景的搭建就不多说了,那个我的打 ...
- IOS开发-OC学习-protocol(协议)
在OC语言中,协议是一组方法,里面有两种方法,一种是遵守这个协议的类的实例必须实现的方法,另一种是可以实现也可以不实现的方法. 例如我定义一个学生的协议,这个协议里有两个方法,其中一个是必选的方法:学 ...
- IOS开发-OC学习-Info.plist文件解析
Info.plist文件是新建ios项目完成后自动生成的一个配置文件,在Xcode中如下图: 通过解析可以获得配置的具体细节,解析过程如下: // 定义一个nsstring用来获取Info.plist ...
- IOS开发-OC学习-MD5加密
MD5的全称是Message-Digest Algorithm 5. MD5加密算法为现在应用最广泛的哈希算法之一,该算法广泛应用于互联网网站的用户文件加密,能够将用户密码加密为128位的长整数.数据 ...
- IOS开发-OC学习-Foundation框架练习
OC语言Foundation框架中字典.字符串.数组的应用: NSString *string = @"China|Usa|France"; NSArray *array = [s ...
- IOS开发-OC学习-NSTimer的使用
上一篇博客中在改变属性值的时候使用了timer进行自动改变.关于NSTimer的更详细的用法如下: 定义一个NSTimer类型的timer,和一个count,其中timer是定时器,count是计数的 ...
随机推荐
- PPT 动态迷幻图谱
迷幻动画的本质拆解 插件: islide + 软件: PowerPoint https://www.islide.cc/ 圆型 画一个正圆,无填充色,边框 2.25磅 左边红色.右边黄色.中间两个透明 ...
- 【已解决】:Original error: Could not extract PIDs from ps output. PIDS: [], Procs: [“ps: uiautomator”]
报错截图 因为appium服务用的是1.4.x版本,使用的是 uiatumator1.0在android7.0得不到支持,所以获取PIDS得到空. 解决办法 找到Appium安装目录下node_mod ...
- CPU推理|使用英特尔 Sapphire Rapids 加速 PyTorch Transformers
在 最近的一篇文章 中,我们介绍了代号为 Sapphire Rapids 的第四代英特尔至强 CPU 及其新的先进矩阵扩展 (AMX) 指令集.通过使用 Amazon EC2 上的 Sapphire ...
- Python pickle 二进制序列化和反序列化 - 数据持久化
模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化. "pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 & ...
- SE11/SE16N修改表数据
1.SE11修改方法 首先修改显示格式 选择SE16标准列表 双击这条数据 输入/H,回车,再回车 修改CODE为EDIT,F8 此时,数据已经可以修改了 2.SE16N修改方法 2.1断点修改 输入 ...
- LeetCode | 983.最低票价(动态规划)
在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行.在接下来的一年里,你要旅行的日子将以一个名为days的数组给出.每一项是一个从 1 到 365 的整数. 火车票有三种不同的销售方式: 一张 ...
- BZOJ 3450 - Tyvj1952 Easy (期望DP)
描述 某一天 WJMZBMR 在打 osu~~~ 但是他太弱逼了,有些地方完全靠运气:( 我们来简化一下这个游戏的规则: 有 \(n(n\le 300000)\) 次点击要做,成功了就是 o,失败了就 ...
- Educational Codeforces Round 110 (Rated for Div. 2) (AB签到,C题双指针,D题DP好题)
补题链接:Here 1535A. Fair Playoff 四名选手参加了季后赛.比赛按以下方案进行:第一名选手与第二名选手比赛,第三名选手与第四名选手比赛,然后两人中的获胜者进入决赛. 众所周知,在 ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) A~C 个人题解
补题链接:Here 1498A. GCD Sum 题意:给定一个 gcdSum 操作:\(gcdSum(762) = gcd(762,7 + 6 + 2) = gcd(762,15) = 3\) 请问 ...
- debian更新openssh 9.6
先更新一下,然后安装libssl-dev zlib1g-dev依赖文件 apt update apt install build-essential apt-get install -y libssl ...