1、NSObject:
1.1、所有自定義類的根類
1.2、提供了類對象的建立方法 alloc、init、new
[SHDog new]; <=>[[SHDog alloc]init];
1.3、copy方法:
1.3.1、淺拷貝:
SHDOG *dog = [[SHDog alloc]init];
__weak SHDog *dog1;
dog1 = dog;
</pre><pre name="code" class="objc">
一個指針釋放另一個指針也會釋放,節省空間
1.3.2、引用計數拷貝:
SHDOG *dog = [[SHDog alloc]init];
SHDog *dog1;
dog1 = dog;
一個指針釋放,另一個指針不受影響,在OC中大量使用
1.3.3、深拷貝:
int *p1 = (int*)malloc(4);
*p1 = 10;
int *p2 = (int*)malloc(4);
*p2 = *p1;
兩個指針各自有自己的堆空間
1.3.4、自定義類實作深拷貝時需要采納NSCopying協定
//
// SHInteger.h
//
// Created by shuan on 16/8/24.
// Copyright © 2016年 shuan. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SHInteger : NSObject<NSCopying>//采納協定
@property int integer;
-(id)initWithInteger:(int)integer;
+(id)integerWithInteger:(int)integer;
-(void)show;
@end
1.3.5、在自定義類的.m檔案中實作NSCopying協定中的方法copyWithZone
//
// SHInteger.m
//
// Created by shuan on 16/8/24.
// Copyright © 2016年 shuan. All rights reserved.
//
#import "SHInteger.h"
@implementation SHInteger
-(id)initWithInteger:(int)integer
{
if (self = [super init]) {
self.integer = integer;
}
return self;
}
+(id)integerWithInteger:(int)integer
{
__autoreleasing SHInteger *i = [[SHInteger alloc]initWithInteger:integer];
return i;
}
-(void)show
{
NSLog(@"%d",self.integer);
}
-(id)copyWithZone:(NSZone *)zone
{
SHInteger *i = [[SHInteger allocWithZone:zone]initWithInteger:self.integer];
return i;
}
@end
1.3.6、在主函數中用copy方法實作深拷貝,該方法在函數體中會自動調用copyWithZone
//
// main.m
//
// Created by shuan on 16/8/24.
// Copyright © 2016年 shuan. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "SHInteger.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
SHInteger *i1 = [SHInteger integerWithInteger:10];
// SHInteger *i2 = [SHInteger integerWithInteger:20];
// i2.integer = i1.integer;
SHInteger *i3 = [i1 copy];
[i3 show];
NSLog(@"%p",i1);
NSLog(@"%p",i3);
i3.integer = 20;
[i1 show];
}
return 0;
}
運作結果如下:
1.3.7、copy可以作為property的參數,是屬性指派時得到的是副本
@property(copy) SHBook *book;
1.4、類對象
1.4.1、類對象不是類的對象
1.4.2、是一種資料,用來在OC中唯一辨別一個類
SHStudent *stu = [SHStudent studentWithName:@"張三" andAge:18];//stu是類的對象
[stu show];
Class c = [stu class];//變量c是一個類對象
Class c1 = [SHStudent class];//class方法既是執行個體方法又是類方法,執行個體方法與類方法可以重名
1.4.3、該種資料的資料類型是Class
1.4.4、該種資料調用class方法擷取
具體如下:
1.4.5、類資訊比較
1.4.5.1、isKindOfClass:判斷某對象是否為指定類或其父類的對象
建立一個SHRectangle類再寫一個SHSquare類繼承SHRectangle,運作如下:
1.4.5.2、isMemberOfClass:判斷某對象是否為指定類的對象(與父類無關,隻判斷指定類)
if ([s isMemberOfClass:[SHRectangle class]]) {
NSLog(@"對象s是類SHRectangle的對象");
}
1.4.5.3、isSubclassOfClass:判斷某個類是否為指定類的子類
if ([s isMemberOfClass:[SHRectangle class]]) {
NSLog(@"對象s是類SHRectangle的對象");
}
1.5、方法選擇器
1.5.1、也是一種新的資料,用于唯一辨別類中的方法
1.5.2、該資料的資料類型是SEL
1.5.3、該資料可以通過@selector獲得
SEL sel = @selector(study);
1.5.4、InstanceRespondToSelector:
判斷一個類中是否有指定的方法
if ([SHStudent instancesRespondToSelector:sel]) {
NSLog(@"在SHStudent類中有study方法");
}
1.5.5、respondsToSelector:
判斷一個對象是否能調用指定方法
if ([stu respondsToSelector:sel]) {
NSLog(@"對象stu可以調用study方法");
}
1.5.6、performSelector:
用于調用方法選擇器辨別的方法
[stu performSelector:sel];//[stu study]
if ([stu respondsToSelector:@selector(learn)]) {
[stu performSelector:@selector(learn)];
}
1.6、協定選擇器
1.6.1、也是一種新的工具用于表示工程中的協定
1.6.2、該資料的資料類型是Protocol*
1.6.3、該資料可以通過@protocol獲得
Protocol *p = @protocol(NSCopying);
1.6.4、conformsToProtocol:
判斷一個類是否采納了某一協定
if ([SHStudent conformsToProtocol:p]) {
NSLog(@"類SHStudent采納了NSCopying協定");
}
if ([SHTeacher conformsToProtocol:p]) {
NSLog(@"類SHTeacher采納了NSCopying協定");
}
思考練習:
1、寫一個SHPoint,該類支援深拷貝
1.1、有兩個屬性x,y
1.2、有方法,帶參初始化,帶參工廠,show
2、寫一個SHCircle類
2.1有一個圓心(支援深拷貝)和一個半徑
2.2帶參初始化,工廠,有求周長,面積
代碼如下:
SHPoint.h:
#import <Foundation/Foundation.h>
@interface SHPoint : NSObject<NSCopying>
@property int x;
@property int y;
-(id)initWithX:(int)x andY:(int)y;
+(id)pointWithX:(int)x andY:(int)y;
-(void)show;
@end
SHPoint.m:
#import "SHPoint.h"
@implementation SHPoint
-(id)initWithX:(int)x andY:(int)y
{
if (self = [super init]) {
self.x = x;
self.y = y;
}
return self;
}
+(id)pointWithX:(int)x andY:(int)y
{
__autoreleasing SHPoint *p = [[SHPoint alloc]initWithX:x andY:y];
return p;
}
-(void)show
{
NSLog(@"(%d,%d)",self.x,self.y);
}
-(id)copyWithZone:(NSZone *)zone
{
SHPoint *p = [[SHPoint allocWithZone:zone]initWithX:self.x andY:self.y];
return p;
}
@end
SHCircle.h:
#import <Foundation/Foundation.h>
#import "SHPoint.h"
@interface SHCircle : NSObject
@property(copy) SHPoint *point;
@property int radius;
-(id)initWithPoint:(SHPoint*)point andRadius:(int)radius;
+(id)pointWithPoint:(SHPoint*)point andRadius:(int)radius;
-(void)show;
-(void)circumference;
-(void)area;
@end
SHCircle.m:
#import "SHCircle.h"
#define PI 3.1415
@implementation SHCircle
-(id)initWithPoint:(SHPoint *)point andRadius:(int)radius
{
if (self = [super init]) {
self.point = point;
self.radius = radius;
}
return self;
}
+(id)pointWithPoint:(SHPoint *)point andRadius:(int)radius
{
__autoreleasing SHCircle *c = [[SHCircle alloc]initWithPoint:point andRadius:radius];
return c;
}
-(void)circumference
{
NSLog(@"周長:%g",2*PI*self.radius);
}
-(void)area
{
NSLog(@"面積:%g",PI*self.radius*self.radius);
}
-(void)show
{
NSLog(@"%d (%d,%d)",self.radius,self.point.x,self.point.y);
}
@end
main.m:
#import <Foundation/Foundation.h>
#import "SHCircle.h"
#import "SHPoint.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
SHPoint *p = [SHPoint pointWithX:5 andY:6];
SHCircle *c = [SHCircle pointWithPoint:p andRadius:5];
if ([SHCircle instancesRespondToSelector:@selector(circumference)]) {
if ([c respondsToSelector:@selector(circumference)]) {
[c performSelector:@selector(circumference)];
}
}
if ([SHCircle instancesRespondToSelector:@selector(area)]) {
if ([c respondsToSelector:@selector(area)]) {
[c performSelector:@selector(area)];
[c show];
}
}
}
return 0;
}
今天就說到這
原創允許轉載,轉載請以超連結形式指明出處