OC-4

  2016-8-12 


OC学习过程中的笔记

1、 NSString *str = @”Hello OC~~~”;

NSLog(@”%@”,str);

只要输出一个字符串,则必须在””前加@。(只输出一个格式控制符也叫一个字符串 两个双引号出现就是一个字符串)

NSString的格式标识符为%@ 故如此输出

2、应该这么理解方法定义:

-(void) setWord1:(NSString ) word1 setWord2:(NSString ) word2

“setWord1:setWord2:”是方法名,word1和word2是参数名。你所谓的参数2的名称(setWord2)其实是方法名的一部分,而不是参数名。objective-c的发明者希望方法名读起来像一个通顺的句子,结合这点来理解方法定义,就不会对objective-c怪异的语法感到困惑了。

例如,定义一个求两个数的和的方法,

-(float) addNumber1:(float)num1 toNumber2:(float)num2;

方法名“addNumber1:toNumber2:”读起来就像一个通顺的句子。

3、OC中self 类似于 java中的this

①OC没有私有成员,而是通过接口与实现两部分的方式来实现封装,在实现中定义接口没有的成员即为私有成员(仅供该类使用 不提供给子类及外部使用)

②使用interface声明的成员变量是只能在自己类和子类使用的(oc的默认访问权限是protected),而不能在类的外部使用,(就是通过类名. 点的方式是显示不出来的),pproperty则相反,它可以在类的外部访问,在类的内部可以通过下划线+变量名或者self.变量名的方式来访问。

③@property给默认访问权限的成员变量提供了一套getter和setter给外界 并且可以使用点语法

④另可使用访问控制符

但注意myWorld是指向对象的该对象的类的类型的引用,在使用的时候不能用点语法 而是用-> eg:myWORLD->cc

而对property定义的变量 外部调用只能用点语法不能用->

->是直接调用改成员 (因为property定义的是私有变量,所以不能直接调用),而点语法是调用getter setter方法

OC是不推荐成员变量即使是用公共访问控制符访问的,所以在其它语言中很常用的.语法 ,在OC中只给@property定义的变量提供

(property定义的变量可以使用点语法 默认调用setter getter方法)

这体现了oc良好的封装性,需要与外界交互的变量全权由property负责定义 等。

property 字面意思—属性 理解之

【注意property不只是可以定义基本类型,还可以定义对象,声明委托等等】

对于通过property与interface定义变量的两种定义方法的理解

见我的个人网站OC1文章 ,详细解释@interface @property两种定义变量的方法

当然 也可以用访问控制符来实现

@private 本类

@public

@protected 本类及子类

@package

当然也有getter setter oc为了简便,提供了合成存取方法 @property @synthesize

注意 @property int abc 后 实际上的成员变量为_abc 自动加了下划线请注意 (但是 在外部运用点语法的时候,依然使用xxx.abc而不是xxx.底层成员变量,相当于套了一层引用,我觉得可以叫表层成员变量) 可以通过synthesize的参数来修改

若@synthesize name 则默认等效于@synthesize name=name

此时 就可以直接运用点语法了

以下资料来自百度

『当定义了一系列的变量时,需要写很多的getter和setter方法,而且它们的形式都是差不多的,所以Xcode提供了@property和@synthesize属性,@property用在 .h 头文件中用作声明,@synthesize用在.m 文件中用于实现。

在X-code4.5以前,在.h中声明完属性之后,如:

@property(nonatomic,assign) int age;

@property(nonatomic,assign) NSString *name;

需要在.m中写上

@synthesize int age;

@synthesize NSString *name;

系统会自动去实现setter和getter方法

而在X-code4.5之后,@synthesize就不需要再写了,系统会直接去实现setter和getter方法。

【补充:但是 若要自己重写setter 或getter方法 则必须在实现部分声明@synthesize 注意 若@synthesize name则等效于把name的底层变量从_name修改成了name要注意】

另外,声明完property属性之后,会自动生成下划线,如_age、_name;如果不想要下划线,那么就可以使用@synthesize去修饰,例如,在.m中写@synthesize age;那么_age就会变成age』

4、一些习俗

接口部分和实现部分通常放到两个文件中(接口.h 实现.m)

成员变量通常加一个下划线用_a 参数用a

库前两个大写字母加特殊标识 一般表公司

5、@interface helloworld:NSObject

任何类都继承于NSObject 在没有其它父类的时候必须标明

6、OC中不存在类变量,但存在类方法,可以定义一个全局变量(static)(在实现部分)然后通过类似于getMethod 定义一个类方法返回该变量,称之为模拟类变量

7、OC须手动装箱

NSNumber 方法:numberWithXxx initWithXxx xxxValue

自动装箱不支持ARC

【补充:装箱的意义:将基本类型装箱成对象, 便于将『基本类型元素』储存在像集合这种只能储存对象的结构】

8、只要涉及对象 都要@ 而且是建立一个引用指向对象 故

ABC q = xxx 要打 是一个指针

9、(A)oc中也有类似于java中的toString方法———description

该方法为NSObject的方法 重写该方法以实现功能(打印对象)

直接输出该对象等于调用该方法

一般重写该方法用于告诉外界该对象所具有的状态信息

该方法返回值为NSString*

(B)oc中也有java中字符串的一些特性

比如 常量池保证相同的字符串直接量只有一个,不会产生多个副本,即两个指针指向同一个常量池中的对象,而可以用stringWithFormat方法(类似于java中的stringBuffer)将字符串对象创建在运行时内存区(堆内存)中。

[NSString stringWithFormat:”abc”]

(C)同java一样,==可以判断基本类型相等和指针地址相等(包括指向对象的引用 故判断字符串相等的时候要注意,需要用isEqualToString方法,注意NSObject的isEqual和==是等价的,经常需要重写)

10、nil相当于其它语言的NULL

11、OC中的『协议』相当于其它语言的接口

非正式协议通过类别和扩展实现 不强制实现所有方法

正式协议 @protocol 必须实现协议中所有方法

(但可以用@optional @required(默认)来改变)

使用协议定义的方法只可调用该协议中声明的[方法],且只有两种定义语法 [用此方法来限定只能调用该协议中声明的方法]

NSObject* p;

id p;

p是指向对象的变量名

类可继承多个协议 协议可继承多个协议

定义方法 使用方法见书

@protocol XXX

@end

对委托的理解 见OC-3

12、扩展即为匿名类别,但类别只能有方法,而扩展可以增加实例变量 用@property @synthesize等

13、NSString 是不可变类 字符串一旦生成则不可改变

可以用NSMutableString(NSString的子类) 该类定义的字符串可以改变(但需要用到方法如appendFormat insertString 等等)


且听风吟