1. 程式人生 > >黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

黑馬程式設計師-OC學習筆記-點方法、成員變數作用域以及set方法和get方法@property的綜合題

------<a href="http://www.itheima.com" target="blank">Java培訓、Android培訓、iOS培訓、.Net培訓</a>、期待與您交流! -------

1.  OC建立物件的拓展:

Fraction * myFraction = [[Fraction alloc] init] ;

獲得物件的例項並且初始化了其例項變數(可以這樣理解:將 alloc 訊息傳送給 Fraction 類請求建立一個新例項,然後向新建立的例項物件傳送 init 訊息來初始化該物件)。

另外一種方法:Fraction * myFraction = [Fraction new];

開始一直都使用該方法,在開發中,實際使用第一種方法比較多。

物件呼叫方法 [myFraction setNumerator :1];用完釋放 Fraction 物件的方法: [myFraction release];

注:建立一個新物件,都要請求分配記憶體,在完成對該物件的操作時,必須釋放其所用的記憶體空間

2.點語法:點語法的本質還是方法的呼叫。當使用點語法時,編譯器會自動展開成相應的方法

例:

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

{

    Person *p = [Personnew];

    p.age=10; // 相當於[p setAge:10]

    intc = p.age; // 相當於[p getAge]

}

點方法用圖表示如下:


//注意的是:在使用點方法的時候需要先有set方法和get方法的宣告和實現,否則不能用;還有就是在方法的實現裡面使用點方法需要注意,不要形成死迴圈。

例:下面的兩個方法在呼叫點方法會造成死迴圈。

- (void) setAge:(int)age

 {

self.age = age; // 這段程式碼會引發死迴圈

}

- (int) age

{

    return self.age // 這段程式碼會引發死迴圈

}

區別:java的點方法是直接訪問成員變數,而OC中編譯器遇到點方法就自動轉成set方法和get方法。OC的點方法主要是讓程式能被其它語言開發者看懂。

3. OC成員變數的作用域

1>  基本概念

區域性變數、全域性變數都有自己的作用域,成員變數也不例外

2>  型別

@private:只能在當前類的物件方法中直接訪問

@protected:可以在當前類以及子類的物件方法中直接訪問

@public:任何地方都可以直接訪問

@package:同一個“體系內”(框架)可以訪問,介於@private和@public之間

3>  繼承的補充

專業術語:

父類\超類 superclass

子類 subclass\subclasses

OC的繼承都是單繼承,只有一個父類

4>  @implementation補充

在程式碼中,即使沒有@interface,只有@implementation,也可以開發一個類。而且類裡面還可以有成員變數,成員變數的作用域和有@interface宣告的一樣。但是需要注意的是,如果@interface聲明裡面有成員變數,而同一類的implementation中再宣告成員變數,那麼implementation的變數型別只是能@private的,而且不能和宣告的成員變數同名。。4. OC字串學習

int  main()

{

NSString*newStr = [NSString stringWithFormat:@"My age is %d and no is%d",age,no];// OC的字串很強大,在字串裡面還可以列印多個引數。

NSLog(@"--%@",newStr);

[newStrlength];//算字串的方法,但是跟C有區別,length算的是字數,不是字元數。

strlen(newStr);//算的是字元,如果newStr 有中文,佔3個字元,算出的結果就不一樣。

return0;

}

/*

題目:設計一個類Circle,用來表示二維平面中的圓

思路分析:如何才能用程式來設計一個二維平面圓呢?我們知道,圓是由半徑繞著圓心而圍成的,也就是說,想要畫一個圓,需要知道圓心還有就是半徑。圓心在二維空間就是(x,y).半徑可以設計另外一個點,計算點到點的距離就可以了。下面就是先設計一個點,再一步步實現圓的。

1.先設計一個類Point2D,用來表示二維平面中某個點

 1> 屬性

 * double x

 * double y

 2> 方法

 * 屬性相應的set和get方法

 * 設計一個物件方法同時設定x和y

 * 設計一個物件方法計算跟其他點的距離

 * 設計一個類方法計算兩個點之間的距離

 3> 提示

 * C語言的math.h中有個函式:doublepow(double n, double m); 計算n的m次方

 * C語言的math.h中有個函式:doublesqrt(double n); 計算根號n的值(對n進行開根)

2.再設計一個Circle類表示二維平面圓

 1> 屬性

 * doubleradius (半徑)

 * Point2D*point (圓心)

 2> 方法

 * 屬性相應的set和get方法

 * 設計一個物件方法判斷跟其他圓是否相交(重疊返回YES,否則返回NO)

 * 設計一個類方法判斷兩個圓是否相交(重疊返回YES,否則返回NO)

 */

<pre name="code" class="html">#import <Foundation/Foundation.h>
#include "Circle.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        // 建立一個圓物件,點方法設定圓的半徑
        Circle *c1 = [[Circle alloc] init];
        c1.radius = 3;
        
        Circle *c2 = [[Circle alloc] init];
        c2.radius = 5;
        
        
        // 建立一個點的物件,setter 方法設定兩點
        Point2D *p1 = [[Point2D alloc] init];
        [p1 setX:0 andY:0];
        Point2D *p2 = [[Point2D alloc] init];
        [p2 setX:3 andY:4];
        
        // 設定圓心
        [c1 setPoint:p1];
        [c2 setPoint:p2];
        
        // 分別使用物件方法和類方法比較輸出圓是否重疊,重疊輸出1,不重疊輸出0
        BOOL result1 = [c1 compareCircleWithOther:c2];
        BOOL result2 = [Circle compareWithCircle1:c1 andCircle2:c2];
        NSLog(@"物件方法計算的結果=%d,類方法計算的結果=%d",result1,result2);
    }
    return 0;
}

//
//  Circle.h
//  06-作業圓與圓之間的距離
//
//  Created by 黃煥恩 on 16/1/1.
//  Copyright © 2016年 黃煥恩. All rights reserved.
//
/*
6.設計一個類Circle,用來表示二維平面中的圓
1> 屬性
* double _radius (半徑)
* Point2D *_point (圓心)

2> 方法
* 屬性相應的set和get方法
* 設計一個物件判斷跟其他圓是否重疊(重疊返回YES,否則返回NO)
* 設計一個類方法判斷兩個圓是否重疊(重疊返回YES,否則返回NO)
*/
#import <Foundation/Foundation.h>
#import "Point2D.h"

@interface Circle : Point2D
{
    Point2D *_point2d; // 圓心的屬性
}

@property double radius;  // 圓半徑的setter 和 getter 方法

- (void)setPoint: (Point2D *)point; // 圓心之間的距離 setter 方法
- (Point2D *)point; // 圓心之間的getter 方法


- (BOOL)compareCircleWithOther: (Circle *)other;

+ (BOOL)compareWithCircle1: (Circle *)circle1 andCircle2: (Circle *)circle2;

@end

//
//  Circle.m
//  06-作業圓與圓之間的距離
//
//  Created by 黃煥恩 on 16/1/1.
//  Copyright © 2016年 黃煥恩. All rights reserved.
//

#import "Circle.h"

@implementation Circle

- (void)setPoint: (Point2D *)point  // 設定圓心
{
    _point2d = point ;
}
- (Point2D *)point
{
    return _point2d;
}

- (BOOL)compareCircleWithOther: (Circle *)other
{

    return [ Circle compareWithCircle1:self andCircle2:other];
}

+ (BOOL)compareWithCircle1: (Circle *)circle1 andCircle2: (Circle *) circle2
{
    // 計算的是圓心的距離,這裡需要注意
    double distanceXY = [self comparePointWithNum1:circle1->_point2d andNum2:circle2->_point2d];
    double radiusXY = circle1.radius + circle2.radius;
    return  distanceXY < radiusXY;
}

@end

//
//  Point2D.h
//  05-計算兩點之間的距離
//
//  Created by 黃煥恩 on 16/1/1.
//  Copyright © 2016年 黃煥恩. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Point2D : NSObject

@property double x;  // 自動生成_x的setter 和 getter
@property double y; // 自動生成_y的 setter 和 getter
- (void)setX: (double)x andY: (double)y;
// 同時設定_x
- (double)comparePointWithOther: (Point2D *)other;
+ (double)comparePointWithNum1: (Point2D *)num1 andNum2: (Point2D *)num2;

@end

//
//  Point2D.m
//  05-計算兩點之間的距離
//
//  Created by 黃煥恩 on 16/1/1.
//  Copyright © 2016年 黃煥恩. All rights reserved.
//
/*
 5.設計一個類Point2D,用來表示二維平面中某個點
 1> 屬性
 * double x
 * double y
 
 2> 方法
 * 屬性相應的set和get方法
 * 設計一個物件方法同時設定x和y
 * 設計一個物件方法計算跟其他點的距離
 * 設計一個類方法計算兩個點之間的距離
 
 3> 提示
 * C語言的math.h中有個函式:double pow(double n, double m); 計算n的m次方
 * C語言的math.h中有個函式:double sqrt(double n); 計算根號n的值(對n進行開根)

 */
#import "Point2D.h"
#import "math.h"

@implementation Point2D
- (void)setX: (double)x andY: (double)y
{
    self.x = x; // 使用的是點方法
    self.y = y; // 使用的是點方法
   // [self setX: x]; // 最原始的setter
   // [self setY: y];
}
- (double)comparePointWithOther: (Point2D *)other  // 點是個類,所以引數是類
{
    return ([Point2D comparePointWithNum1:self andNum2:other]);
}
+ (double)comparePointWithNum1: (Point2D *)num1 andNum2: (Point2D *)num2
{
    double xdete ;
    double ydete;

    xdete = num1.x - num2.x;
    ydete = num1.y - num2.y;
    
    return sqrt( pow(xdete, 2) + pow(ydete, 2));
    
}
@end



總結:這道題綜合性挺強,主要用到的知識就是類的組合方法,set方法和get方法,@property關鍵字以及物件方法和類方法。在演算法上,涉及到數學的平方公式函式pow()和開平方公式sqrt();在程式中,加入了self關鍵字的使用,使得看似不一樣的方法,可以合併成同一樣的方法,減少了程式碼使用的重複性。難點主要是類中的屬性又是一個類,在涉及類的set方法時候就要注意了,傳遞的引數是(類名 *)引數。另外還需要注意的是,任何一個類,除了類方法的呼叫不需要建立新的物件外,其它需要用到物件的,都必須先建立一個新物件,然後再呼叫方法。

最後需要注意的是格式要求,這段程式碼的寫法比較規範,可讀性強,看起來比較舒服。