本人ios开发小白。熟悉c,c++,但是对于objective-c和所有第一次接触他的人一样,“这都tm是什么玩意儿啊!”。想要好好看这个玩意儿很久了,但是断断续续总是在开始阶段。想的太多,做的太少。这一次,从第一弹开始,come on!本系列算是斯坦福大学《ios7开发》视频的学习笔记。视频请看网易公开课。
objective-c总是以这种方式建立一个类
例如Card类
头文件
Card.h
@interface Card : NSObject
@end
源文件
Card.m
#import "Card.h"
@implementation Card
@end
在头文件中定义属性的方法为,例如Card的内容
@property (strong, nonatomic) NSString* content;
@property (nonatomic) BOOL isChoosed;
@property相当于关键字,用于定义一个属性。strong和nonatomic则是用于描述属性的一些特性。strong表示为强类型,与之的对立是weak弱类型。强弱类型的区别是,强类型为如果app中有任意一个对象占有使用强类型,则系统不对其进行释放。弱类型为没有强类型的对象使用占有时,则系统对其进行释放(ios系统使用的时引用计数的方式进行对内存管理,后续再完善)。nonatomic则为非原子的,非原子的则是非线程安全的,即不允许多个线程对其进行修改。若为线程安全,则后续中会有很多代码锁定。一般来说,定义为非原子。第二个isChoosed的属性,因为时bool类型的,为基本类型,没有strong,weak之分(可以简单理解为,指针类型才有这个分别)。
objective-c的属性,有set和get方法。当在头文件中定义属性的时候,系统自动的已经生成了相应的默认set和get方法。偶尔有时候,定义自定义的set和get方法是有必要的,那么这个时候就需要在源文件中对其进行显示的定义。方法如下
@synthesize content = _content;
-(void)setContent:(NSString *)content
{
_content = content;
}
-(NSString*)getContent
{
return _content;
}
-(void) setIsChoose:(BOOL)isChoose
{
_isChoose = isChoose;
}
第一行@synthesize是定义自定义set和get方法必须的。第一行的代码有些奇怪,他的意思时将content属性存储在_content中,当然_content只是为了更好的阅读,也可以定义为别的名称。它只是系统识别content的系统名称。
从get和set方法可以看出,objective-c方法的定义也不一样。-表示此方法属于对象,对应的时+,表示方法时独立于对象时属于类的。(void)表示返回类型,紧跟着的是方法名称。:后面跟的是参数类型及参数,如果没有参数则没有。关于get方法,也可以在头文件中对其重命名,比如
@property (nonatomic,getter=hasChoosed) BOOL isChoose;
剩下的就是方法的定义了。刚才说到set和get方法的时候提到了方法的定义。那么具体看一个例子
头文件中
-(int) Matched:(Card*) card;
源文件中
-(int)Matched:(Card *)card
{
int result = 0;
if([self.content isEqual:card])
{
result = 1;
}
return result;
}
另外可以注意到,对属性的调用和c,c++中并没有区别。但是objective-c中的独有调用方式也可以是[self content],和.调用是同样的。
补充一句,objective-c的调用方法[对象 方法]。对于objective-c的基本语法,网络上有很多很全了,这里就不概述了。
今天的学习就到这里,明天未完待续。
例子的完整代码:
Card.h
#import <Foundation/Foundation.h>
@interface Card : NSObject
@property (strong, nonatomic) NSString* content;
@property (nonatomic,getter=hasChoosed) BOOL isChoose;
-(int) Matched:(Card*) card;
-(int) CardsMatched:(NSArray*) cards;
@end
Card.m
#import "Card.h"
@implementation Card
@synthesize content = _content;
@synthesize isChoose = _isChoose;
-(void)setContent:(NSString *)content
{
_content = content;
}
-(NSString*)getContent
{
return _content;
}
-(void) setIsChoose:(BOOL)isChoose
{
_isChoose = isChoose;
}
-(BOOL) hasChoosed
{
return _isChoose;
}
-(int)Matched:(Card *)card
{
int result = 0;
if([self.content isEqual:card])
{
result = 1;
}
return result;
}
-(int) CardsMatched:(NSArray *)cards
{
int results = 0;
for(Card* card in cards)
{
if([card.content isEqual:card.content])
{
results = 1;
}
}
return results;
}
@end