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
id
p是指向对象的变量名
类可继承多个协议 协议可继承多个协议
定义方法 使用方法见书
@protocol XXX
@end
对委托的理解 见OC-3
12、扩展即为匿名类别,但类别只能有方法,而扩展可以增加实例变量 用@property @synthesize等
13、NSString 是不可变类 字符串一旦生成则不可改变
可以用NSMutableString(NSString的子类) 该类定义的字符串可以改变(但需要用到方法如appendFormat insertString 等等)