以前也接触过很多面向对象的语言,然而object的使用却和别的有所不同, 开始的时候不太适应,但是慢慢发现他其实很简介明了!
类的申明
@interface ClassName: NSObject //类似与java的类的声明 父类为NSobject
@implementation ClassName //是以上申明类的实现部分
类的初始化
1.方法一
Fraction *myFraction;
myFraction = [Fraction alloc]; //申请地址空间
myFraction = [myFraction init]; //对象初始化
2.方法二
Fraction *name = [[Fraction alloc] init];
使用
分类 1.类方法
我认为这类似与java中的静态方法,可以直接用类名去调用,类可以不实例化
+ (方法返回类型) 方法名 : (参数类型) 参数名
2.对象实例方法
这个方法必须类经过实例化以后,利用实例化后的对象去调用
- (方法返回类型) 方法名 : (参数类型) 参数名
object-c 中循环结构和java,c,c++ 差不多,无非就是for,while,do
关于循环中的推出
** break
当执行到错误或者不想再执行的条件时,退出循环
** continue
跳出本次循环,执行下次循环
The if statement
if ( expression )
program statement 1
else
program statement 2
The switch statement
switch ( expression )
{
case value1:
program statement
program statement
...
break;
case value2:
program statement
program statement
...
break;
...
case valuen:
program statementThe switch Statement
program statement
...
break;
default:
program statement
program statement
...
break;
}
The conditional operator
condition ? expression1 : expression2
在写大型项目时,要很好的组织结构要将类分离,连接,组合
将@interface 写在.h中,将实现写在.m中,这个c++特性有点类似!
这是object-c的一个新特性,它类似与java或者c++中的set和get方法,只不 过他把这两个方法内置了!你只需要在interface模块中用@property 定义你 的属性。
interface
@interface Fraction : NSObject
@property int numerator, denominator;
-(void)
print;
-(double) convertToNum;
@end
implement
#import "Fraction.h"
@implementation Fraction
@synthesize numerator, denominator;
-(void) print
{
NSLog (@"%i/%i", numerator, denominator);
}
-(double) convertToNum
{
if (denominator != 0)
return (double) numerator / denominator;
else
return NAN;
}
@end
如果属性使用以上方法定义了,或者手工写了set和get方法,就可以直接用 实例+.+属性去给属性赋值或者得到属性的值
关于继承和java 是类似的;
object有个root class 叫做NSObject
@class 当要利用到外部类的时候,利用@class引入该类
有人会说哪和#import 作用不是一样, 其实是有区别的:
1.import会包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你。
2.在头文件中, 一般只需要知道被引用的类的名称就可以了。 不需要知道其内部的实体变量和方法,所以在头文件中一般使用@class来声明这个名称是类的名称。 而在实现类里面,因为会用到这个引用类的内部的实体变量和方法,所以需要使用#import来包含这个被引用类的头文件。
3.在编译效率方面考虑,如果你有100个头文件都#import了同一个头文件,或者这些文件是依次引用的,如A–>B, B–>C, C–>D这样的引用关系。当最开始的那个头文件有变化的话,后面所有引用它的类都需要重新编译,如果你的类有很多的话,这将耗费大量的时间。而是用@class则不会。
4.如果有循环依赖关系,如:A–>B, B–>A这样的相互依赖关系,如果使用#import来相互包含,那么就会出现编译错误,如果使用@class在两个类的头文件中相互声明,则不会有编译错误出现。
所以,一般来说,@class是放在interface中的,只是为了在interface中引用 这个类,把这个类作为一个类型来用的。 在实现这个接口的实现类中,如果 需要引用这个类的实体变量或者方法之类的,还是需要import在@class中声明 的类进来.
听到动态,我第一个想到的是java的反射机制,在程序运行时,动态获取类状态, 并可以改变其属性
这样说好理解一些,id就类似与java中的最基类,object,所有子类都可以向 上强转成object,当使用子类方法时,又可以转回来,调用子类方法。 id比 java这种机制要好很多,我的理解是它是一个指针,指向什么它就是什么,并 可以调用其指向的类的方法!
所谓动态,就是运行时,将id于实际的类绑定,这一看就比java的强转高级, 利用id类型去调用方法不会报错,在程序运行的时候它会去动态查看绑定的类, 然后调用方法。
@private
作用范围只能在自身类
@protected
作用范围在自身类和继承自己的子类,什么都不写,默认是此属性。
@public
作用范围最大,在任何地方
@package
对于framwork是protected 对于外部是@pravita
在代理中定义,不要初始化,在调用的地方 extern val=**;
使用单例实现:
xxxAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
appDelegate.Your Variable
在m文件中定义
作用域为单一文件
建立一个静态函数,对其静态变量进行操作。
object-c中
enum flag { false=0, true=1 };
c++ 中
typedef NS_ENUM(NSInteger, Test)
{
TestA = 1, //1 1 1
TestB = 1 << 1, //2 2 10 转换成 10进制 2
TestC = 1 << 2, //4 3 100 转换成 10进制 4
TestD = 1 << 3, //8 4 1000 转换成 10进制 8
TestE = 1 << 4 //16 5 10000 转换成 10进制 16
};