天天看點

OC-NSObject1、NSObject:

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;
}
           

運作結果如下:

OC-NSObject1、NSObject:

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方法擷取

具體如下:

OC-NSObject1、NSObject:

1.4.5、類資訊比較

1.4.5.1、isKindOfClass:判斷某對象是否為指定類或其父類的對象

建立一個SHRectangle類再寫一個SHSquare類繼承SHRectangle,運作如下:

OC-NSObject1、NSObject:

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;
}
           

今天就說到這

OC-NSObject1、NSObject:
OC-NSObject1、NSObject:

原創允許轉載,轉載請以超連結形式指明出處