object-c中@是什么意思,有什么作用
放在一个字符串前面代表的是你这个字符串是NSString类型的。文件类型说明:
.h 头文件,用于定义类、实例变量及类中的方法等定义信息(interface)。
.m 源文件,定义方法体,可实现objce-c和c方法(implementation)。
.mm c++源文件object-c支持强类型和弱类型两种方式定义一个对象变量:
强类型定义时变量类型即类命,且为指针类型
弱类型定义使用id型定义1 MyClass *myObject; // 强类型定义 2 id myObject; //弱类型定义
4.方法的调用:
在Object-C中,调用一个方法叫做发送消息,方法调用语句定义在中括号”[]”中:1
[myArray insertObject:anObject atIndex:0];
为了避免生成大量的临时变量,Object-C允许嵌套调用方法,使一个方法的返回值当作另一个方法的参数,如:
[[myAppObject theArray] inserObject[myAppObject objectToInsert] atIndex:0];
5.self变量相当于java中的this。
6.继承
Ojbect-C中的继承同java相同,都是单一继承关系,要继承一个类,可写作:
1 @interface ClassA : NSObject
2
3 @end
其中NSObject类是最顶层类,一般所有类的最终父类都是它。
在子类中可以访问父类中的非private变量的实例变量和方法(静态方法和实例方法)。
注:只能访问非private属性的成员变量,说明该变量必须定义在interface中(类的声明中),因为在implementation中声明的成员变量全部都是private。
在子类中通过super访问父类中的方法,如:
1 [super init];
7.枚举
// 定义枚举
enum flag { false, true };
// 声明两个枚举变量,该枚举变量的值只能是true或false
enum flag endOfData, matchFound;
// 定义枚举
enum direction { up, down, left = 10, right };
// 或
enum boolean { no = 0, false = 0, yes = 1, true = 1 };
8.、函数
1)概念:具有特定功能的代码块的封装
2)函数的定义: 函数类型+函数名(形参列表)
函数类型 函数名(形参类型1 形参名1,形参类型2 形参名2…..) {
函数体;//函数的实现
}
函数的好处:将不同的功能实现封装起来,容易阅读和维护;便于分工,调用的人可以不关心具体的实现
9.递归
1)概念:函数自己调用自己的一个过程
2)递归的优点是使代码结构层次更清晰使程序更简洁,缺点是占用资源太多,可能造成堆栈溢出。
10.
interface 用于声明类 默认是@protected (受保护的成员);@interface中只能写方法的声明(不能写实现)
.m文件内 @implementation中只能写方法的实现(不能写声明)
类的访问级别说明
1、@public 公有的成员,本类的成员方法,和其他的方法都可以访问
2、@protected 保护型的成员,本类和本类的子类的方法可以访问
3、@private 私有的成员,只能被本类的方法访问
4、@package 处于同一个框架中可以访问,介于private和public之间
11.
类实例化的两种方法
1、使用 alloc、init方法 例如: Person *p=[[Person alloc]init]; alloc表示为对象在堆中开辟一片内存空间;init 表示初始化类对象。
2、使用new关键字,例如: Person *p=[Person new]; 一般不建议使用此方法。
12.
set和get方法的使用
1、set方法用于给某个成员变量赋值,一般以set开头,接着变量名,带一个参数,参数类型与成员变量类型相同,没有返回值。
2、get方法用于获取某个成员变量的值,是实例方法,一般与成员变量名相同,(可以不加get在方法前面),没有参数,有返回类型,返回类型与成员变量的类型相同。
13.
实例方法与类方法的区别
1、实例方法之间可以使用self互相调用,类方法不可以。
2、实例方法可以操作成员变量,类方法不可以。
3、类方法调用直接用类名,不需要另外构建实例。
14:用 new 还是用 alloc/init
1.在实际开发中很少会用到new,一般创建对象咱们看到的全是[[className alloc] init],但是并不意味着你不会接触到new,在一些代码中还是会看到[className new],还有去面试的时候,也很可能被问到这个问题。
通过源码中我们发现,[className new]基本等同于[[className alloc] init];区别只在于alloc分配内存的时候使用了zone,这个zone是个什么东东呢?它是给对象分配内存的时候,把关联的对象分配到一个相邻的内存区域内,以便于调用时消耗很少的代价,提升了程序处理速度;
3.而为什么不推荐使用new?
不知大家发现了没有:如果使用new的话,初始化方法被固定死只能调用init,而你想调用initXXX怎么办?没门儿!据说最初的设计是完全借鉴Smalltalk语法来的。而传说那个时候已经有allocFromZone:这个方法,但是这个方法需要传个参数id myCompanion = [[TheClass allocFromZone:[self zone]] init]; 这个方法像下面这样
但是,出现个问题:这个方法只是给对象分配了内存,并没有初始化实例变量。是不是又回到new那样的处理方式:在方法内部隐式调用init方法呢?后来发现“显示调用总比隐式调用要好”,所以后来就把两个方法分开了。
15:
这里写链接内容