界面与实现
@界面
和@执行
当你开始使用 Objective-C 时,你首先要学习的东西是:
-
@界面
...@结尾
-
@执行
...@结尾
稍后您将学到的是类别和类扩展。
类别允许您通过添加新的类或实例方法来扩展现有类的行为。作为惯例,类别是自己定义的.{嗯}
像这样的文件:
我的对象+类别名称.h
@界面 我的对象 (分类名称) - (空的)富; - (布尔值)酒吧与酒吧:(整数)巴兹;@结尾
我的对象+类别名称.m
@执行 我的对象 (分类名称) - (空的)富 { // ... } - (布尔值)酒吧与酒吧:(整数)巴兹 { 回来 和; }@结尾
类别对于标准框架类中的便捷方法特别有用(只是不要过度使用您的辅助函数)。
专业提示:不要用随机的、任意的颜色值使代码混乱,而是创建一个
NS色
/界面颜色
定义的调色板类别类方法+appNameDarkGrayColor
.然后,您可以通过创建方法别名在其上添加一个语义层,例如+appNameTextColor
谁回来+appNameDarkGrayColor
.
扩展看起来像类别,但省略了类别名称。这些通常在@执行
指定私有接口甚至覆盖接口中声明的属性:
@界面 我的对象 ()@财产 (读写, 尼希塔托马尔, 鲜明的) 字符串 *姓名;- (空的)做一点事;@结尾@执行 我的对象@合成 姓名 = _姓名;// ...@结尾
特征
财产政策也是早期学习的概念:
@财产
@合成
@动态的
关于属性的一个有趣说明是,从 Xcode 4.4 开始,不再需要显式合成属性。属性声明于@界面
自动合成(带有前导下划线 ivar 名称,即@synthesize 属性名 = _属性名
) 在实施中。
转发类声明
不时地,@界面
声明引用属性中的外部类或作为参数类型。而不是添加#进口
声明每个类,建议在标头中使用前向类声明并将它们导入到实现中。
@班级
更短的编译时间,更少的循环引用机会;如果你还没有习惯的话,你绝对应该习惯它。
实例变量的可见性
这是一个通用约定,类通过属性和方法公开状态和变异接口,而不是直接公开 ivar。
尽管 ARC 通过处理内存管理使使用 ivars 的工作更加安全,但上面提到的自动属性合成删除了一个地方,否则将声明 ivars。
然而,在ivars的情况下是直接操作,有以下可见性指令:
-
@民众
: 实例变量可以直接用符号读写人物->改变 = 32"
-
@包裹
: 实例变量是公共的,除非在指定它的框架之外(仅限 64 位架构) -
@protected
: 实例变量只能被其类和派生类访问 -
@私人的
: 实例变量只能被它的类访问
@界面 人:对象 { @民众 字符串 姓名; 整数 改变; @私人的 整数 薪水;}
日志
当 Objective-C 程序员意识到他可以定义自己的协议时,在他的早期开发中有一个特定点。
协议的美妙之处在于它们允许程序员设计可以在类层次结构之外继承的契约。这是美国梦核心的平等主义口号:无论你是谁,来自哪里,只要足够努力,任何人都可以取得任何成就。
...或者至少这是一个想法,对吧?
-
@协议
...@结尾
:定义一组方法,由任何符合协议的类实现,就好像添加到该类的接口中一样。
没有耦合负担的架构稳定性和表现力——日志很棒。
请求选项
您可以通过根据需要或可选指定方法来进一步自定义日志。可选方法存根在接口中以在 Xcode 中自动完成,但如果未实现该方法则不会生成警告。默认情况下需要日志方法。
的语法@必要的
和@选修的
遵循可见性宏:
@协议 自定义控件委托 - (空的)控制:(海关监管 *)控制 didSucceedWithResult 成功:(ID)结果;@选修的 - (空的)控制:(海关监管 *)控制 didFailWithError 错误:(NS 错误 *)错误;@结尾
异常处理
Objective-C 主要通过NS 错误
.虽然其他语言会使用异常处理来做到这一点,但 Objective-C 拒绝真正异常行为的异常,包括编程错误。
@
指令用于传统约定尝试/抓住/最后
块:
@试图{ // 尝试执行以下语句 [自己 接收值:&韦特 错误:&错误]; // 当异常被抛出或显式抛出时... 如果 (错误) { @垃圾 例外; }} @抓住(异常异常 *电子) { // ...在这里处理异常} @最后 { // 始终在@try 或@catch 块的末尾执行此操作 [自己 清理];}
文字
文字是指定固定值的简写符号。文字或多或少与程序员的满意度直接相关。按照这个标准,Objective-C 长期以来一直是程序员的苦难语言。
对象文字
直到最近,Objective-C 还只有文字字符串
.但随着发布Apple LLVM 4.0-编译器, 文字为国民服役号码
,数组
和NS词典
非常高兴地加入了。
-
@""
: 返回一个字符串
使用引号内的 Unicode 内容初始化的对象。 -
@42
,@3.14
,@是的
,@'Z'
: 返回一个国民服役号码
使用适当的类构造函数初始化的对象,使得@42
→[NSNummer numberWithInteger:42]
, 或者@是的
→[NSNummer numberWithBool:YES]
.支持使用后缀进一步指定类型,如@42U
→[NSNummer numberWithUnsignedInt:42U]
. -
@[]
: 返回一个数组
使用以逗号分隔的对象列表作为内容初始化的对象。例如,@[@“A”,@NO,@2.718]
→[NSArray arrayWithObjects:@"A", @NO, @2.718, nil]
(注意哨兵无效的
从字面上看是没有必要的)。 -
@{}
: 返回一个NS词典
以指定的键值对作为内容初始化的对象,格式为:@{@"someKey" : @"theValue"}
. -
@()
:动态计算装箱表达式并根据其值返回相应的对象文字(即字符串
为了常量字符*
,国民服役号码
为了整数
, ETC。)。这也是使用数字文字的预期方式数数
价值观。
Objective-C-文字
选择器和协议可以作为方法参数传递。@选民()
和@协议()
充当伪文字语句,返回指向特定选择器的指针(出去
) 或日志 (协议 *
).
-
@选民()
: 返回一个出去
指向具有给定名称的选择器的指针。用于类似的方法-performSelector:withObject:
. -
@协议()
: 返回一个协议 *
指向具有指定名称的日志的指针。用于类似的方法-konformToProtocol:
.
C 文字
文字也可以反向工作,将 Objective-C 对象转换为 C 值。这些指南尤其让我们能够深入了解 Objective-C 的面纱并了解真正发生的事情。
你知道所有的 Objective-C 类和对象都只是美化的吗?结构
斯?或者一个对象的整个身份取决于一个对象是一个
其中的字段结构
?
对于我们大多数人来说,至少在大多数时候,获取这些知识只是一种学术练习。但对于任何冒险进行低级调整的人来说,这只是一个开始的地方。
-
@编码()
: 返回类型编码的一种。此类型值可用作编码为的第一个参数NSCoder-encodeValueOfObjCType:at
. -
@defs()
: 返回 Objective-C 类的布局。例如,声明一个具有与对象
,你只需要做:
结构 { @定义(对象) }
埃德。正如读者所指出的@secboffin&@amaajou,
@defs
在现代 Objective-C 运行时中不可用。
优化
有一些@
专门设计用于为一般优化提供快捷方式的编译器指令。
-
@autoreleasepool{}
:如果您的代码包含创建大量临时对象的紧密循环,您可以使用@autorelease
通过更积极地重新分配来优化这些短暂的本地化对象的方向。@autoreleasepool
替换和改进旧的NS自动释放池
,这明显较慢并且不适用于 ARC。 -
@同步(){}
:该指令提供了一种方便的方法来确保在特定上下文中安全执行特定块(通常自己
).然而,以这种方式锁定是昂贵的,因此对于旨在达到一定级别的线程安全的类,一个专用的NSLock
属性或使用低级锁定功能,例如OSAtomicCompareAndSwap32(3)
被推荐。
兼容性
如果之前的所有说明对您来说都是老生常谈,那么您很可能不知道这个:
-
@compatibility_alias
:允许现有类使用不同的名称作为别名。
例如集合视图用过的@compatibility_alias
大大改善使用向后兼容的直接替代品的体验UICollectionView:
// 允许代码简单地使用 UICollectionView,就好像它在 iOS SDK 5 上可用一样。// http://developer.apple. com/legacy/mac/library/#documentation/DeveloperTools/gcc-3。 3/gcc/compatibility_005falias.html#if __IPHONE_OS_VERSION_MAX_ALLOWED < 60000@兼容性别名 UICollectionViewController PSTCollectionViewController;@兼容性别名 UICollectionView 集合视图;@兼容性别名 UICollectionReusableView PSTCollectionReusableView;@兼容性别名 UICollectionViewCell PSTCollectionViewCell;@兼容性别名 UICollectionViewLayout PSTCollectionViewLayout;@兼容性别名 UICollectionViewFlowLayout PSTCollectionViewFlowLayout;@兼容性别名 UICollectionViewLayoutAttributes PSTCollectionViewLayoutAttributes;@协议 UICollectionViewDataSource <PSTCollectionViewDataSource> @结尾@协议 UICollectionViewDelegate <PSTCollectionViewDelegate> @结尾#万一
通过这种巧妙的宏组合,开发人员可以共同开发UICollectionView
通过包容集合视图
--无需担心最终项目的部署目标。作为直接替换,相同的代码在 iOS 6 上的工作方式与在 iOS 4.3 上的工作方式大致相同。
所以要检查:
接口与实现
-
@界面
...@结尾
-
@执行
...@结尾
@班级
实例变量的可见性
@民众
@包裹
@protected
@私人的
特征
@财产
@合成
@动态的
日志
@协议
@必要的
@选修的
异常处理
@试图
@抓住
@最后
@垃圾
对象文字
@""
-
@42
,@3.14
,@是的
,@'Z'
@[]
@{}
@()
Objective-C-文字
@选民()
@协议()
C 文字
@编码()
@defs()
优化
@autoreleasepool{}
@同步{}
兼容性
@compatibility_alias
对许多面孔的详尽概述到此结束@
.它是一个多才多艺、强大的角色,体现了语言的底层设计和机制。