objective-c 新语法特性

PyTorch模型生产部署:ONNX/Triton导出与高可用架构实战 机器学习模型部署本质是训练环境与生产环境之间的运行时契约建立过程,涉及序列化协议、推理引擎兼容性、动态批处理及资源隔离等核心问题。ONNX凭借标准化算子集和跨框架支持,成为平衡兼容性、性能与可维护性的首选导出格式;Triton Inference Server则通过原生多框架支持、动态batching和热加载能力,显著提升GPU利用率与服务SLA保障水平。在金融风控、电商推荐等高要求场景中,基于ONNX+Triton+K8s的分层架构可稳定支撑千级QPS与毫秒级P95延迟,同时满足模型热更新、可观测性与版本 阅读详情

http://www.infoq.com/cn/articles/wwdc2012-objective-c-new-feature




今年2012的WWDC上,苹果针对Objective-C和LLVM编译器都做了重大改进,我们来看一看Objective-C增加了哪些新特性。

1、方法顺序无关

Objective-C类由声明文件h和实现文件m组成,所有的public方法都在h文件中声明,private方法可以写在m文件中,但是在早期的编译环境中需要注意方法的顺序,例如下面的代码,在早期的编译环境会给出警告:

类和方法声明:

@interface ObjcNewFeatures : NSObject
-(void)doSomething:(NSString *) text;
@end

实现:

@implementation ObjcNewFeatures
-(void)doSomething:(NSString *)text{
    NSLog(@"%@", [text stringByAppendingFormat:[selfgetCode]]);
}
-(NSString *)getCode{
    return@"Unicode";
}
@end

早期编译器编译时会出现:warning: instance method ‘-getCode:’ not found…

这是因为根据编译顺序,编译器不知道在doSomething之后还有getCode方法,所以会给出警告。解决办法有多种,比如可以把getCode方法放到doSomething之前,也可以提前声明私有方法,如下: 在m文件中增加:

@interfaceObjcNewFeatures()
-(NSString *)getCode;
@end

新版编译器在LLVM中增加了新特性,改变了顺序编译的方式,首先扫描方法声明,然后再对其实现部分进行编译。这样无论是public还是private方法,就变得顺序无关了。目前XCode的最新版本4.3.3采用的默认编译器是Apple LLVM compiler 3.1,以上代码在最新的编译环境下正常运行。

2、枚举类型的改进

在OS X v10.5之前,我们如何在Objective-C中定义一个枚举类型呢?如下:

typedef enum { 
    ObjectiveC,
    Java, 
    Ruby, 
    Python, 
    Erlang }
Language;

这种写法简单明了,用起来也不复杂,但是有一个问题,就是其枚举值的数据范围是模糊的,这个数值可能非常大,可能是负数,无法界定。

在OS X v10.5之后和iOS中,你可以这样写:

enum {
    ObjectiveC,
    Java,
    Ruby,
    Python,
    Erlang
};
typedef NSUInteger Language;

这种写法的好处是,首先这个枚举的数据类型是确定的,无符号整数。其次由于我们采用了 NSUInteger,可以不用考虑32位和64位的问题。带来的问题是数据类型和枚举常量没有显式的关联。

在XCode4.4中,你可以这样写枚举了:

typedef enum Language : NSUInteger{
    ObjectiveC,
    Java, 
    Ruby, 
    Python, 
    Erlang 
}Language;

在列出枚举内容的同时绑定了枚举数据类型NSUInteger,这样带来的好处是增强的类型检查和更好的代码可读性。

当然,对于普通开发这来说,枚举类型可能不会涉及到复杂的数据,使用之前的两种写法也不会有什么大问题。无论如何,在XCode4.4发布之后,我们就可以尝试采用新的写法了。

3、属性合成

每个开发人员对property都很熟悉,我们需要为类定义属性,编写getter和setter方法。那么我们在Objective-C中是如何进行处理属性呢?很简单,首先在h文件中定义属性:

@property (strong) NSString *name;

然后在m文件中使用@synthesize指令实现属性的accessor方法和定义实例变量ivar:

@synthesize name = _name;

@synthesize的含义是,如果没有进行重载的情况下,编译器会根据读写属性自动为类实例变量_name生成getter和setter方法。当然,你也可以用@dynamic指令指定该属性的相关方法由开发人员实现。

这样看起来是不是已经很简单了?但是没有最简单只有更简单。在XCode4.4中,我们可以省略掉@synthesize name = name;这一行,完全交给编译器去实现。也就是说在h文件中声明属性name后,就可以直接在实现文件中使用该属性的getter和setter方法,并使用实例变量name。并且编译器会根据属性的可读和可写自动判断是否提供setter方法。

那么在这种情况下,如果你声明了@dynamic的属性,编译器该如何处理呢?所有synthesize相关的特性将不再起作用,你需要自己去实现属性的相关方法。

总接一下属性合成的新特性:

除非明确说明,否则属性相关的accessor方法(getter和setter)将自动生成。
除非所有的accessor方法提供实例变量,否则实例变量(例如_name)会自动生成。
如果使用了@synthesize,并没有提供实力变量名的话,会自动生成。
如果使用了@dynamic,那么自动合成无效,需要开发者自己实现。
Core Data的NSManagedObject及其子类不使用默认的属性合成功能。

4、语法简化

很多刚从其他编程语言转到Objective-C的同学看到长长的函数名会感到崩溃,不过我在上一篇文章中也提到过,这种语法让消息的传递像一个英语句子,大大增强了可读性。比如你想初始化一个浮点数,需要这么写:

NSNumber value = [NSNumber numberWithFloat:123.45f];

从这句中我们能够明确的知道代码的含义,但是,是否连简单的赋值语句也要这么处理呢?苹果在本次新特性中采用了折中的处理方式,针对很多基础类型采用了简写的方式,实现语法简化。简化以后,我们会发现从语法层面,这些简化的Objective-C更像Python和Ruby等动态语言的语法了。下面我们逐一介绍:

NSNumber

简化前的写法:

NSNumber *value;
value = [NSNumber numberWithInt:12345];
value = [NSNumber numberWithFloat:123.45f];
value = [NSNumber numberWithDouble:123.45];
value = [NSNumber numberWithBool:YES];

简化后的写法:

NSNumber *value;
value = @12345;
value = @123.45f;
value = @123.45;
value = @YES;

装箱表达式也可以采用类似的写法:

NSNumber *piOverSixteen = [NSNumber numberWithDouble: ( M_PI / 16 )];
NSString *path = [NSString stringWithUTF8String: getenv("PATH")];

可以分别简写为:

NSNumber *piOverSixteen = @( M_PI / 16 );
NSString *path = @( getenv("PATH") );

对于字符串表达式来说,需要注意的是表达式的值一定不能是NULL,否则会抛出异常。

NSArray

对于NSArray的初始化来说,有非常多的写法,这里就不再一一罗列,我们直接看新的写法

NSArray *array;
array = @[];               //空数组
array = @[ a ];          //一个对象的数组
array = @[ a, b, c ]; //多个对象的数组

非常简单,再也不用记住初始化多个对象的数组时,后面还要跟一个倒霉的nil。 现在我们看一下当声明多对象的数组时,编译器是如何处理的:

array = @[ a, b, c ];
编译器生成的代码:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects)/ sizeof(id);
array = [NSArray arrayWithObjects:objects count:count];

好吧,编译器已经为我们把这些简单重复的工作都做了,我们就可以安心解决真正的问题了:)不过有一点要注意,如果a,b,c对象有nil的话,运行时会抛出异常,这点和原来的处理方式不同,编码的时候要多加小心。

NSDictionary

同样,对于字典这个数据结构来说,有很多种初始化的方式,我们来看新的写法:

NSDictionary *dict;
dict = @{};     //空字典
dict = @{ k1 : o1 };     //包含一个键值对的字典
dict = @{ k1 : o1, k2 : o2, k3 : o3 }; //包含多个键值对的字典

最后我们总接一下容器类数据结构简化的限制: 采用上述写法构建的容器都是不可变的,如果需要生成可变容器,可以传递-mutableCopy消息。例如

NSMutableArray *mutablePlanets = [@[
   @"Mercury", @"Venus", @"Earth",
   @"Mars", @"Jupiter", @"Saturn",
   @"Uranus", @"Neptune"
 ] mutableCopy];

 

不能对常量数组直接赋值,解决办法是在类方法(void)initialize进行赋值,如下:

@implementation MyClass
static NSArray *thePlanets;
+ (void)initialize {
  if (self == [MyClass class]) {
    thePlanets = @[
      @"Mercury", @"Venus", @"Earth",
      @"Mars", @"Jupiter", @"Saturn",
      @"Uranus", @"Neptune"
    ];
} }

没有常量字典

5、对象下标

容器的语法简化让我们不难想到,可以通过下标的方式存取数组和字典的数据。 比如对于数组: 

NSArray *array = @[ a, b, c ];

我们可以这样写:

id obj = array[i];     //通过下标方式获取数组对象,替换原有写法:array objectAtIndex:i];
array[i] = newObj;     //也可以直接为数组对象赋值。替换原有写法:[array replaceObjectAtIndex:i withObject:newObj];

对于字典:

NSDictionary *dict = @{ k1 : o1, k2 : o2, k3 : o3 };

我们可以这样写:

id obj = dict[k2];     //获取o2对象,替换原有写法:[dic objectForKey:k2];
dic[k2] = newObj;  //重新为键为k2的对象赋值,替换原有写法:[dic setObject:newObj forKey:k2]

同时,我们自己定义的容器类,只要实现了规定的下标方法,就可以采用下标的方式访问数据。要实现的方法如下:

数组类型的下标方法

- (elementType)objectAtIndexedSubscript:(indexType)idx; 
- (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx; 
字典类型的下标方法
- (elementType)objectForKeyedSubscript:(keyType)key; 
- (void)setObject:(elementType)object forKeyedSubscript:(keyType)key;

其中需要注意的是indexType必须是整数,elementType和keyType必须是对象指针。

总结

关于语言的新特性这次就介绍到这里,使用新版的Objective-C,你就可以获得这些新特性,编写更简洁的代码,同时避免一些常见的陷阱。One more thing,这些语法特性是完全向下兼容,使用新特性编写出来的代码,经过编译后形成的二进制程序可以运行在之前发布的任何OS中。

由于苹果公司Mac、iPhone和iPad销量的突飞猛进,App Store上的应用形成了一个庞大的App帝国,这个完整的生态圈同时又有力的推进了开发语言Objective-C的高速发展,这门语言既保持了面向对象、消息传递和动态语言的特性,同时也在不断的做减法,语法的简化会大大提升开发者的效率,让开发者的精力更多的放在创意和App的实现上

SimSwap复现指引及代码分析【2023有更新】 我的环境!!!😚😚😚 之后会遇到:还会遇到至此环境配置完毕!下面是所需要的checkpoint。至此环境准备结束。先试试环境是否有问题,图片是代码包中给的。我用的是512的checkpoint,无水印,a是源脸,b是目标脸。输出到./output/result_whole_swapsingle.jpg 如图是可以成功换脸的:(为了方便查看将图像裁剪到了128x128) 表示图像预处理,相应的改为也是一样。不加就是对已经面部对齐的图像进行简单的面部交换。 加上就是无水印。 交换一张图片中的所有面孔。 阅读详情

相关推荐

汽水音乐自动化薅羊毛教程:从零搭建稳定赚钱脚本

📖 前言:为什么要学习自动化脚本?在数字时代,时间就是金钱。汽水音乐等App通过观看广告奖励用户金币的模式,本质上是将我们的时间转化为收益。本教程将教你如何用Python自动化这个过程,让程序为你"打工",实现被动收入。通过本教程,你将学到:移动端自动化测试的核心技术Python在自动化领域的实际应用如何将重复性任务转化为自动化流程创造属于自己的"数字员工"第一章:环境准备与基础配置1.1 硬件要求Android手机一部(建议使用备用机)USB数据线。

weixin_44947827的博客 5778

语法基础——Objective-C语法基础

前言 学习过Swift之后,好久没用已经生疏了,现在有项目来了,不得不停下手下的工作,开始学习OC,当然这篇文章会以Java基础和C基础作为支撑,这样学习起来入门很简单,可能这篇文章有点个人主义,用作个人笔记吧 OC特点 支持C语法 支持面向对象特性 兼容性好,可以同时在项目中使用OC、C++,也可以引入C、C++库文件 OC中没有命名空间机制,也没有包的概念,为了区分不同的类,在类名...

点击置顶文章查看博客目录(全站式导航) 2万+

获取气体传感器温度调制响应数据并转换为NumPy数组

本任务旨在获取气体传感器在温度调制条件下的响应数据,将其处理为结构化数据格式(NumPy数组),以便用于机器学习模型训练。整个过程包含数据采集、预处理、特征工程和格式转换等关键步骤。

huanghm88的专栏 1207

Objective-C的基本语法

文章来源: 1,Objective-C 2.0语法简介      1,OC的Hello World! #import   int mian(int argc, const char * argv[]) {      NSLog(@"Hello World!");           return 0; }          注解:使用#import可以智能包含头文件,不需要

$firecat利白的代码足迹$ 1330

(35)远程识别(又称无人机识别)(一)

Ardupilot官网关于《Peripheral Hardware》的翻译 —《(35) 远程识别(又称无人机识别)》。

无人机开发(开源Ardupilot) 4万+

0032期基于深度学习的大米识别-含数据集

083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

grehtsfrs的博客 1506

object-c 语法

objective-c是C语言的一个扩展集,主要由APPLE公司维护,是MAC系统下的主要开发语言。 1.NSlog()函数:               例如:NSLog(@"zzz")        输出信息zzz; 注意:cocoa所有的函数,常量和类型名称都添加了NS前缀 2.双引号的前面的@表示这双引号中的字符串应该作为cocoa的NSString元素来处理。 例如:NSStr

Hello,你好! 3297

华为OD机试真题 新系统 2026-06-10 C++ 实现【设备重排SN】

通信设备SN一般是包含:字母、数字,用'-'(破折号)进行分组分割,例如:8F-3T-1G-2n是一个有效的SN地址。 现在要对已经存在的SN 按照新的规则进行重排:

MISAYAONE的博客 129

Objective-C语言的语法

在Objective-C中,方法是类的核心组成部分。方法的定义使用表示实例方法,表示类方法。以下是一个简单的实例方法的定义:@end");@end```在Objective-C中,类是对象的蓝图。类由@interface和两个部分组成。如下所示:@end@end```Objective-C是一种强大的编程语言,通过结合C语言的高效性和Smalltalk的面向对象特性,成为苹果生态系统中的核心语言。

2401_90032315的博客 1701

【图像超分】论文精读:Accelerating the Super-Resolution Convolutional Neural Network(FSRCNN)

作为应用于图像超分辨率 (SR) 的成功深度模型,超分辨率卷积神经网络 (SRCNN) [1,2] 在速度和恢复质量方面都比以前的手工制作的模型表现出更好的性能。然而,高计算成本仍然阻碍了它的实际使用,这需要实时性能(24 fps)。在本文中,我们旨在加速当前的 SRCNN,并提出了一种紧凑的沙漏形 CNN 结构,以实现更快和更好的 SR。我们从两个方面重新设计了SRCNN结构。首先,我们在网络末端引入了一个反卷积层,然后将映射直接从原始低分辨率图像(无插值)学习到高分辨率图像。其次,我们通过在映射之前缩小

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1万+

爬虫Incapsula reese84加密案例:Etihad航空(纯算法)

爬虫Incapsula reese84加密案例:Etihad航空,本文就不再讲解如何找加密参数、定位加密参数,以及分析加密的一个过程。就直接从扣算法开始,扣算法前先看之前讲解的加密函数生成的过程,文章会一个函数一个函数的讲解扣算法。fiddler根据规则替换本地文件。调试过程中遇到部分环境不一样是正常的,具体还要根据自己调试的js为准,就像之前补环境时是有二十一个循环,这次扣算法多出一个循环,不过大部分环境是一样的第一个函数:通过document.addEventListener添加了很多事件。

老衲爱洗头的博客 1992

Objective-C语法基础

Objective-C语法基础

qq_44974032的博客 1115

CANoe如何实现TLS协议

TLS,Transport Layer Security,传输层安全协议。是在传输层和应用层之间,为了保证应用层数据能够安全可靠地通过传输层传输且不会泄露的安全防护。

jasonj333 1159

关于寒假学习objective-c的感想

买了本《learn objective-c on Mac》,一开始买来看起来还蛮薄的,250页,看了后,发现语言都有很多共同的地方,新的特性都从C++和java类似过来,就是换了个名字,感觉看了以后感觉收获蛮大,虽然只接触了点皮毛。 1.C语言知识 2.了解了xcode使用 3.懂得了一些新语法和新特性。 ------------------------------------------...

insertyou 92

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Something you need to know about Objective-C and iOS programming: for experienced programmers

Although I have been programming with C, python, etc. for years, Objective-C is completely new to me, and it really freaked me out a little bit at the beginning.   Here are some new syntax and feature

My iOS Dev Learning Curve 667

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

03-Foundation中NSMutableArray遍历、复制和排序

目录: 一、NSString补充 二、NSMutableArray可变数组 三、遍历 四、NSArray支持的新语法 五、数组复制 六、数组的排序 SDK、API、Foundation、Cocoa是什么? SDK Software Development Kit开发工具包,目标文件.o实现库,非开源。 API Application Program Interfac...

a1250156的博客 153

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Xcode 4.4中LLVM compiler 4.0带来的Objective-C新语法特性

今年WWDC 2012苹果全球开发者大会上,苹果针对LLVM编译器都做了重大改进,新版的Xcode 4.4中的LLVM编译器升级到了4.0,给Objective-C带来了很多令人惊喜的特性。注意,下面的语法需要下载Xcode 4.4。1、枚举类型的改变老写法:typedef enum Week{ Moday, Tuesday, Wednesday, Thursday

空杯子 1万+

深入浅出Objective-c

著作权声明:本文由http://blog.youkuaiyun.com/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢! 1、十分钟让你明白Objective-C的语法(和Java、C++的对比) C++: void helloWorld(bool ishelloworld) { //干点啥 }

小人物的草稿本 1476

Objective - C 全解:从基础到高级特性

Flyable.hObjective - C 是一门功能丰富、历史悠久的编程语言,在苹果生态系统的开发中有着重要的地位。它结合了 C 语言的高效和面向对象编程的灵活性,同时提供了诸如内存管理、类别、KVC 和 KVO 等高级特性。通过本文的介绍,你应该对 Objective - C 有了一个全面的了解。希望你能在实际开发中运用 Objective - C 来创建出优秀的应用程序。

m0_57836225的博客 1311

Objective-C新特性

基于Xcode4.4(不完全独有)。 1. 成员方法无需前置声明 之前,我们调用一个定义在后面(未声明)的成员方法,比如[self callSomeMethod],会得到警告说没有找到该函数。 通常,这种情况下,为了消除这个警告,我们会很郁闷地(为了代码整洁)跑到前面声明下,使用旧版本Xcode往往还要临时写一个匿名扩展(新版本Xcode自动生成);或者(无所谓地)直接把后面的函数定

JasonLee的专栏 3739

深入Objective-C的动态特性

Objective-C具有相当多的动态特性,基本的,也是经常被提到和用到的有动态类型(Dynamic typing),动态绑定(Dynamic binding)和动态加载(Dynamic loading)。 这些动态特性都是在Cocoa程序开发时非常常用的语言特性,而在这之后,OC在底层也提供了相当丰富的运行时的特性,比如枚举类属性方法、获取方法实现等等。虽然在平常的Cocoa开发中这些较底

Always believe that something wonderful happen 912

Objective-c中的C特性

数组: 定义一组有序的数据项,即数组。 如果在字符数组结尾添加一个终止空字符(‘\0’),就产生了一个通常称为字符串的变量。 和其他变量类型一样,必须在使用之前先声明数组, 数组的声明涉及声明数组所包含元素的数值类型,以及将存储在数组中的最大元素数目。 函数: 如果使用了自动引用计数(ARC),那么每次调用函数(方法)时,局部对象的变量都会默认初始化

Qirito的专栏 491

(译)Objective-C的动态特性

过去的几年中涌现了大量的Objective-C开发者。有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语言的。也就是说有很大一部分开发者都没有使用Objective-C太长时间。当你接触一门新语言时,更多地会关注基础知识,如语法和特性等。但通常有一些更高级的,更鲜为人知又有强大功能的特性等待你去开拓。

cactusz的博客 268

Objective-C的动态特性

http://limboy.me/ios/2013/08/03/dynamic-tips-and-tricks-with-objective-c.html 过去的几年中涌现了大量的Objective-C开发者。有些是从动态语言转过来的,比如Ruby或Python,有些是从强类型语言转过来的,如Java或C#,当然也有直接以Objective-C作为入门语言的。也就是说有很大一

qq_24600431的专栏 272
上一篇: iOS 6 下自动旋转的变化
下一篇: glVertexPointer函数说明
Robincui2011
博客等级 码龄15年 21粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值