您的位置:首页 > 其它

oc 点语法 / KVC /readwrite/readonly/

2015-08-27 08:47 316 查看
main.m

#import <Foundation/Foundation.h>

#import "Person.h"

#import "Student.h"

#import "CollegeStudent.h"

#import "Animal.h"

#import "StudentOO.h"

#import "Book.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

/*

//property

Person *person=[[Person alloc]initWithName:@"hiphop" Age:23];

// [person setName:@"miko"];

person.name=@"zhufu"; //[person setName:@"zhufu"];

//只要符合setter和getter这种格式,就可以用点语法,点出来

//.点语法与属性没有半毛钱关系。

//点语法在等号左侧 是setter方法

// 右侧 是getter方法

Student *student=[[Student alloc]init];

student.name=@"wa";

student.gender=@"male";

//

CollegeStudent *cstudent=[CollegeStudent colleageName:@"tian" Age:23 Score:98.8];

//name是只读的。

cstudent.age=12;

cstudent.face=@"笑脸";

//

Animal *monkey=[[Animal alloc]init];

monkey.name=@"tian";

[monkey sayHi];

*/

//点语法

StudentOO *student=[StudentOO studentOOName:@"bella" Gender:@"female" Age:21 Number:39 Score:90];

//初始化对象--开辟空间

Book *bookName=[[Book alloc]init];

bookName.bookname=@"人性的弱点";

student.book=bookName;

//KVC===key-value-coding

StudentOO *student1=[[StudentOO alloc]init];

student1.name=@"";

//forKey

[student1 setValue:@"tijm" forKey:@"name"];

[student1 setValue:@"male" forKey:@"gender"];

//value值 是一个任意对象,记住是对象。

[student1 setValue:@23 forKey:@"age"];

[student1 setValue:@45 forKey:@"number"];

[student1 setValue:@99 forKey:@"score"];

NSLog(@"%@",[student1 valueForKey:@"name"]);

//未定义的,用于排除错误,每当找不到key值的时候会自动调用这两个方法,不写的话会崩溃。

[student1 setValue:@"hehe" forUndefinedKey:@"nian"];

NSLog(@"%@",[student1 valueForUndefinedKey:@"nian"]);

//

bookName.bookname=@"需要独处一处";

//book只是一个Book的类型变量。

//把一个对象赋值给一个没有开辟空间的对象名。

student1.book=bookName;

[student1 setValue:@"花千骨" forKeyPath:@"book.bookname"];

//一次性给多个实例变量赋值

//实例变量存储在字典中,字典的key值必须和实例变量的名字相同。

[student1 setValuesForKeysWithDictionary:@{@"name":@"any",@"gender":@"female",@"age":@"18",@"number":@"34",@"score":@"98",@"book":@"kk"}];

#pragma mark ======使用Block对copy属性的探索

void (^blockCopy)(CollegeStudent *)=^void(CollegeStudent *cstudent){

cstudent.face=@"瓜子脸";

[cstudent release];

};

CollegeStudent *cstudent1=[[CollegeStudent alloc]init];

cstudent1.face=@"臭脸";

blockCopy(cstudent1);

}

return 0;

}

///////////////////////////////////////////////////////////////////////////////////////////////

Book.h

///////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Book : NSObject

@property(retain) NSString *bookname;

-(NSString *)description;

@end

///////////////////////////////////////////////////////////////////////////////////////////////////

Book.m

///////////////////////////////////////////////////////////////////////////////////////////////

#import "Book.h"

@implementation Book

- (NSString *)description

{

return [NSString stringWithFormat:@"%@", _bookname];

}

@end

///////////////////////////////////////////////////////////////////////////////////////////////

StudentOO.h

///////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@class Book;

@interface StudentOO : NSObject

//基本数据类型用assign

//对象类型用retain

//copy现在尽量不用

@property(readwrite,nonatomic,retain) NSString *name;

@property(readwrite,nonatomic,retain) NSString *gender;

@property NSInteger age;

@property NSInteger number;

@property CGFloat score;

//Book对象

@property(retain) Book *book;

-(id)initWithName:(NSString*)name

Gender:(NSString*)gender

Age:(NSInteger)age

Number:(NSInteger)number

Score:(CGFloat)score;

+(id)studentOOName:(NSString*)name

Gender:(NSString*)gender

Age:(NSInteger)age

Number:(NSInteger)number

Score:(CGFloat)score;

-(NSString *)description;

@end

////////////////////////////////////////////////////////////////////////////////////////////////

StudentOO.m

///////////////////////////////////////////////////////////////////////////////////////////////

#import "StudentOO.h"

@implementation StudentOO

-(id)initWithName:(NSString*)name

Gender:(NSString*)gender

Age:(NSInteger)age

Number:(NSInteger)number

Score:(CGFloat)score{

self=[super init];

if (self) {

_name=name;

_gender=gender;

_age=age;

_number=number;

_score=score;

}

return self;

}

+(id)studentOOName:(NSString*)name

Gender:(NSString*)gender

Age:(NSInteger)age

Number:(NSInteger)number

Score:(CGFloat)score{

StudentOO *student=[[StudentOO alloc]initWithName:name Gender:gender Age:age Number:number Score:score];

return student;

}

-(void)setValue:(id)value forUndefinedKey:(NSString *)key{

NSLog(@"%@,%@",key,value);

}

-(id)valueForUndefinedKey:(NSString *)key{

NSLog(@"%@",key);

return @"错误";

}

- (NSString *)description

{

return [NSString stringWithFormat:@"%@,%@,%ld,%ld,%.2f,%@", _name,_gender,_age,_number,_score,_book];

}

@end

///////////////////////////////////////////////////////////////////////////////////////////////

CollegeStudent.h

///////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface CollegeStudent : NSObject<NSCopying>

{

NSString *_name;

NSInteger _age;

CGFloat _score;

NSString *_gender;

NSString *_facce;

}

-(id)initWithName:(NSString*)name Age:(NSInteger)age Score:(CGFloat)score;

+(id)colleageName:(NSString*)name Age:(NSInteger)age Score:(CGFloat)score;

@property(readonly) NSString *name;

//=============================

//本来property内部是有自己的setter和getter方法的,如果你要(setter=method),就相当于你要走另一个setter方法。

@property(setter=setRR:) CGFloat score;

-(void)setRR:(NSInteger)rr;

-(BOOL)rr;

//==================================

//getter也是一样的道理,但这里的getter的返回值只能使用BOOL型的,说明这个实例变量的类型是BOOL型的。

@property NSInteger age;

//@property(getter=ff) NSString *local;

//-(int)ff;

//记住只能对BOOL型的成员变量使用getter。

@property(getter=rr) NSInteger count;

//===================================================

/*

(1)

readwrite 读写 默认的。编译器声明setter和getter方法。

readonly 只读。编译器只声明getter方法。

setter 给编译器指定stter方法名。setter方法基本不使用,一般不要修改编译器定义的setter方法名。

getter 给编译器指定getter方法名,(getter=method)仅对返回值是BOOL类型的方法执行。

(2)原子特性

atmoic 原子性 -默认的,保证线程安全。-对资源浪费很大。

nonatmoic 非原子性,不保证线程安全。-常用。

(3)语义特性,影响setter方法内部实现,跟内存有关。

assign 基本数据类型 对象类型 默认的。

retain 只能给对象类型。

copy 只能给遵循《NSCoping》协议的对象类型使用。

*/

//原子和语义

@property(readwrite,nonatomic,assign) NSString *nameUpper;

@property(nonatomic,retain) NSString *gender;

@property(nonatomic,copy) NSString *face;

-(NSString *)description;

@end

///////////////////////////////////////////////////////////////////////////////////////////////////

CollegeStudent.m

///////////////////////////////////////////////////////////////////////////////////////////////

#import "CollegeStudent.h"

@implementation CollegeStudent

@synthesize name=_name;

-(id)initWithName:(NSString*)name Age:(NSInteger)age Score:(CGFloat)score{

self=[super init];

if (self) {

_name=name;

_age=age;

_score=score;

}

return self;

}

+(id)colleageName:(NSString*)name Age:(NSInteger)age Score:(CGFloat)score{

CollegeStudent *student=[[CollegeStudent alloc]initWithName:name Age:age Score:score];

return student;

}

//用retain 修饰的属性的setter getter方法

-(void)setGender:(NSString *)gender{

if (_gender !=gender) {

[_gender release];

_gender = gender;

}

}

-(NSString *)gender{

return [[_gender retain] autorerelease];

}

//copy修饰的

-(void)setFace:(NSString *)face{

if (_face != face) {

[_face release];

//拷贝一份给_face,防止内存释放了_face后,第二次使用就会找不到了。

_face=[face copy ];

}

}

@end

///////////////////////////////////////////////////////////////////////////////////////////////

Animal.h

///////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Animal : NSObject

@property NSString *name;

@property NSString *color;

-(id)initWithName:(NSString*)name Color:(NSString*)color;

-(void)sayHi;

@end

///////////////////////////////////////////////////////////////////////////////////////////////

Animal.m

///////////////////////////////////////////////////////////////////////////////////////////////

#import "Animal.h"

@implementation Animal

@synthesize name=name;

@synthesize color=color;

-(void)sayHi{

NSLog(@"%@",name);

}

@end

///////////////////////////////////////////////////////////////////////////////////////////////

Student.h

///////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Student : NSObject

{

NSString *_name;

NSString *_gender;

}

@property NSString *name;

@property NSString *gender;

-(NSString *)description;

@end

////////////////////////////////////////////////////////////////////////////////////////////////

Student..m

///////////////////////////////////////////////////////////////////////////////////////////////////

#import "Student.h"

@implementation Student

//如果有@synthesize的话,实例变量就必须自己写。

@synthesize name=_name;

@synthesize gender=_gender;

- (NSString *)description

{

return [NSString stringWithFormat:@"%@,%@", _name,_gender];

}

@end

///////////////////////////////////////////////////////////////////////////////////////////////

Person.h

///////////////////////////////////////////////////////////////////////////////////////////////////

#import <Foundation/Foundation.h>

@interface Person : NSObject

//使用@property,系统会自动帮我们补上实例变量name 和 age。

@property NSString *name;//属性

@property NSInteger age;

//{

// NSString *_name;//实例变量

// NSInteger _age;

//}

-(id)initWithName:(NSString*)name Age:(NSInteger)age;

+(id)personName:(NSString*)name Age:(NSInteger)age;

/*

@property 属性的类型 属性的名字

属性的类型:必须跟操作的实例变量一致,决定了setter方法的参数类型,和getter方法的返回值类型。

属性的名字:实例变量去掉下划线,决定了setter方法和getter方法的名字。

property 内部自动实现setter和getter方法。

*/

//-(void)setName:(NSString*)name;

//-(id)name;

//-(void)setAge:(NSInteger)age;

//-(NSInteger)age;

//

-(void)setPage:(NSString*)page;

-(NSString*)page;

-(NSString*)description;

-(BOOL)isKilledOrNot;

@end

///////////////////////////////////////////////////////////////////////////////////////////////////

Person.m

///////////////////////////////////////////////////////////////////////////////////////////////

#import "Person.h"

@implementation Person

-(id)initWithName:(NSString*)name Age:(NSInteger)age{

self=[super init];

if (self) {

_name=name;

_age=age;

}

return self;

}

+(id)personName:(NSString*)name Age:(NSInteger)age{

Person *person=[[Person alloc]initWithName:name Age:age];

return person;

}

//@synthesize 属性名 = 实例变量;

//=右侧 : 决定了实现setter,getter方法时,方法内部使用实例变量。

//属性的实现是默认的,可以不写。

@synthesize name=_name;

@synthesize age=_age;

-(void)setPage:(NSString*)page{

}

-(NSString*)page{

NSString *_page;

return _page;

}

-(NSString*)description{

return [NSString stringWithFormat:@"%@,%ld",_name,_age];

}

-(BOOL)isKilledOrNot{

BOOL result=YES;

return result;

}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: