黑馬程式設計師-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方法時候就要注意了,傳遞的引數是(類名 *)引數。另外還需要注意的是,任何一個類,除了類方法的呼叫不需要建立新的物件外,其它需要用到物件的,都必須先建立一個新物件,然後再呼叫方法。
最後需要注意的是格式要求,這段程式碼的寫法比較規範,可讀性強,看起來比較舒服。