Objective-C中@class和#import的问题。参考
。
假设,有两个类:ClassA和ClassB,两个之间相互使用到,即构成了circular dependency(循环依赖)。如果在头文件里面只用#import把对方的头文件包含进来(构成circular inclusions,循环包含),则编译器会报错:
Expected specifier-qualifier-list before ‘ClassA’
或者
Expected specifier-qualifier-list before ‘ClassB’
为了避免循环包含,在ClassA.h文件里面用@class classB把classB包含进来,同样,在ClassB.h文件里面用@class ClassA把ClassA包含进来。@class指令只是告诉编译器,这是个类,保留个空间来存放指针就可以了。
接下来,很可能在ClassA.m和ClassB.m中会有访问包含进来对象的成员的情况,这时必须让编译器知道更多信息,比如那个类有些什么方法可以调用,就必须用#import,再次把用到的类包含进来,告诉编译器所需要的额外信息。
否则,编译器会警告:
warning: receiver ‘ClassA’ is a forward class and corresponding @interface may not exist
还有另一种情况,使用有Categories的类,要在.h头文件里用#import把Categories包含进来。
总之,使用原则是:
- 头文件里面只#import超类
- 消息文件里面#import需要发消息过去的类
- 其他地方就用@class转向声明
转载自:
[
]
写在前面, 之所以想写点Objective-C相关知识的文章,是因为近1年都在从事苹果及iPhone的开发,其中也走过不少弯路,也从其他网友那获得了很多帮助,所以想把自己的学习心得写出来,以便有需要的朋友作为参考。以下内容均假定阅读者有一定的软件开发经验。
如果想在苹果Mac OSX系统进行开发,Objective-C是最重要的开发语言,现在Apple已经把开发的重点放在了基于Cocoa库的图形界面, 支持C++的Carbon图形库已经让出了主导地位, 而Cocoa库正是应用Objective-C语言开发的。 如果你有C/C++的编程经验, 那么在进行Objective-C的开发将会容易些,因为Objective-C本身就是C/c++的超集, 它包含C/C++的所有特性和支持标准C库, 但其语法本身更优美 简洁,更能体现OO思想也就是面向对象。
在学习Objective-C之前先把Objective-C(以下会以O-C代替)、Cocoa、Carbon以及XCode等几个名词的概念搞清楚, Objective-C是开发语言,前面说过,O-C是c/c++的超集合, Cocoa是在苹果系统上O-C实现的图形开发库相当于windows系统的win32 SDK和MFC, Carbon是早期苹果操作系统上的C/C++图形库也相当于MFC,XCode是个开发集成环境,相当于windows系统上的Visual Stdio系列。
以上介绍了苹果系统开发的基本概念,现在介绍一些Objective-C基础知识,
- 变量类型
Objective-C支持C的所有类型,也就是说char,unsigned char,int,long,float,double等均可使用;
结构类型 如日期的结构定义
1
2
3
4
5
6
|
struct
Date
{
unsigned
char
day;
unsigned
char
month;
unsigned
char
year;
}
;
|
其它类型比如枚举、及预定义变量均和c语言用法相同
- 文件引用、类型导入
Objective-C中依然可以使用#include来引入其他文件,不过推荐使用#import来导入其它类型,官方文档介绍说这样可以减少出错的几率
- id类型
id是Objective-C中的特殊类型, 他指向一个对象,你可以理解为c中的void*
- 字符串
Objective-C中可以有c类型的字符串,比如”string”,也可以用NSString类型字符串,一般用@”string”表示, 其中‘@’是将字符串”string”转换为NSString类型
以上是一些基本的语言知识, 其中大多数都和c/c++相同,目前为止除了#import之外,其它的内容对于C/C++开发人员来说都非常熟悉了。
这里先从如何调用类的方法开始说起, 看下面的代码
1
2
|
[
object method]
;
[
object methodWithParamter:
param]
;
|
没错,Objective-C就是这样进行方法调用的,与C/c++不同的是 ‘[]’的使用, [] 表示对一个类对象的方法进行调用,其中object是类对象, method就是所调用的方法, 你可以调用带有参数的方法,不过在方法名称和参数之间要保留 ‘:’ 来告知编译器如何编译。
方法也可以有返回值,如下
1
2
|
result =
[
object methodWithRetValue]
;
result =
[
object methodwithPrameterAndRetValue:
param]
;
|
你也可以这样调用类的方法,比如NSString
1
|
NSString
*
string
=
[
NSString
string
]
;
|
这里方法string就是NSString类特殊方法,类似于c++中的静态成员函数
多重方法调用,比如C++ 中的 result = object1.function1 ( object2.function2() );在O-C中可以这样来实现
1
|
result =
[
object1 function1:
[
object2 function2]
]
;
|
代码中 最外层[]表示object1 调用function1方法,里面的[]表示object2 调用function2所得的结果作为function1的参数传入
多参数方法调用,比如c/c++中的 object.function(arg1, arg2,arg3 );在O-C中就该是这样的
首先是方法申明
1
|
-
(
void
)
function:
(
int
)
arg1 secondArg:
(
float
)
arg2 thirdArg:
(
NSString
*
)
arg3;
|
调用时就是这样的
1
|
[
object function:
arg1 secondArg:
arg2 thirdArg:
arg3]
;
|
也就是方法名称后面直接跟参数列表, 其中第一个参数不需要别名,其它参数必须设置别名,O-C使用参数别名还确定所调用参数的,这样编译器才能正确解释,参数之间用1-N个空格分开。
分享到:
相关推荐
接下来,您可以开始探索Objective-C的各种特性和功能,逐步深入学习和开发iOS应用程序了。希望这份指南能够帮助您顺利入门,祝您学习进步! 总结来说,在Windows系统下搭建Objective-C开发环境虽然不像在Mac OS X上...
Objective-C是苹果公司在其操作系统如macOS和iOS中的首选开发语言之一,尤其是在iPhone应用开发中占据着核心地位。 #### 二、Objective-C文件类型 Objective-C中的代码文件主要有以下几种类型: - **.h**:头文件...
Objective-C是一种面向对象的编程语言,基于C语言并扩展了许多特性,主要用于开发苹果的macOS和iOS操作系统下的应用程序。Objective-C支持动态消息传递机制,使得它可以实现运行时多态性。 #### 二、环境搭建与配置...
Objective-C是一种通用、面向对象的编程语言,是开发苹果iOS和macOS平台应用程序的主要语言之一。它在C语言的基础上增加了面向对象的功能,使得代码更易于管理和扩展。自2011年自动引用计数(ARC)的引入,Objective...
Objective-C是苹果生态系统中用于开发iOS和macOS应用的主要编程语言,它基于C语言,并添加了面向对象的特性。在初学者看来,Objective-C的语法可能显得复杂,特别是它的消息传递机制和类定义方式,但理解了其核心...
### Objective-C的语法与Cocoa框架 ...以上步骤展示了如何在 Windows 系统上搭建 Objective-C 的开发环境,并通过示例介绍了 Objective-C 的基本语法和 Cocoa 框架的使用。这对于初学者来说是非常有用的学习资源。
《Objective-C编程》第4版是一本专注于Objective-C语言的书籍,Objective-C是一种面向对象的编程语言,广泛用于苹果公司的操作系统和应用开发中。本书主要面向那些已经具备一定编程基础,并希望深入学习Objective-...
Objective-C中推荐使用`#import`而不是`#include`,这是因为`#import`可以帮助减少重复导入的问题。 - **@interface**:用于定义一个类。例如,在C#中定义一个简单的类: ```csharp public class Kids : System....
在Objective-C(Object-c)编程中,它是Apple的Cocoa和Cocoa Touch框架的基础,主要用于开发iOS和macOS应用程序。本文将深入探讨Object-c的基础知识,包括指令、类、实例化、访问权限、方法等方面。 1. **指令与...
### Objective-C 英文版《Programming in Objective-C 2.0》知识点解析 ...通过以上内容的学习和实践,开发者可以全面掌握Objective-C的核心概念和技术要点,为进一步深入iOS和Mac开发打下坚实的基础。
- **Objective-C语言**:是iOS开发的核心语言之一,教程将围绕该语言展开讲解。 #### 标签解读 - **标签**:“iPhone iOS SDK Xcode Apple”这些标签进一步明确了教程的主题: - **iPhone/iOS**:指明教程专注于...
- 在Objective-C中,`nil`用于表示空指针,与C语言中的`NULL`等价,但在某些上下文中可能有不同的行为。 ### 14. 类别 (Categories) - 类别允许扩展现有类的功能,而不修改原始类的实现。 - 使用`@interface`和`@...
- 可以参考《Programming in Objective-C》一书获得更多深入的学习资料。 - 官方文档和社区资源也非常丰富。 以上是对“Object-C基础教程”的主要内容概括,涵盖了从环境搭建到面向对象编程的核心概念。希望这份...
- **学习目标**:深入理解Objective-C的内存管理机制,避免内存泄漏等问题。 - **学习内容**: - 内存管理基本原则:谁创建谁释放、谁retain谁释放、未创建未retain不释放 - **参考文章**: - [iPhone/Mac ...
- **配置项目**:在创建项目过程中,需要填写项目名称、组织名称、公司标识符、设备方向(如iPhone、iPad)和使用的技术(Objective-C或Swift)。 - **设计用户界面**:使用Interface Builder来设计应用的用户界面。...
iOS应用源码通常由Objective-C或Swift编写,考虑到"unindented-copong-iphone"这个名称,我们猜测这可能是Objective-C的项目,因为早期的iOS开发主要使用这种语言。当然,随着Swift的普及,也不能完全排除使用Swift...
关于导入头文件的问题,#import是Objective-C语言中导入头文件的关键字,而#include是C/C++语言的导入方式。#import可以避免头文件的重复导入,而@class只是告诉编译器某个类的存在,通常用于避免头文件的循环依赖。...