- 不要等到明天,明天太遙遠(yuǎn),今天就行動。
須讀:看完該文章你能做什么?
你能知道property內(nèi)部做了什么事情
1> 生成setter方法、getter方法
2> 在內(nèi)部生成一個私有的變量(_成員變量)
3> 和@synthesize age有區(qū)別 ,@synthesize age;直接賦值給age
學(xué)習(xí)前:你必須會什么?
了解什么是封裝。
一、本章筆記
一、
從Xcode4.4以后 Apple 對 @property進(jìn)行一個增強(qiáng),以后只要利用一個 @property 就可以同時生成 setter 、 getter 方法的聲明 和實(shí)現(xiàn)
沒有告訴 @property 要將傳入的參數(shù)賦值給誰,默認(rèn) @property 會將傳入的屬性 賦值給 _開頭的成員變量
@property 有一個弊端: 他只會生成 最簡單的getter\setter方法的聲明和實(shí)現(xiàn),并不會對傳入的數(shù)據(jù)進(jìn)行過濾
如果想對傳入的數(shù)據(jù)進(jìn)行過濾,那么我們就必須重寫 setter\getter方法
如果不想對傳入的數(shù)據(jù)進(jìn)行過濾,僅僅是提供一個方法給外界操作變量,那么就可以使用
如果利用 @property來生成 getter/setter方法,那么我們可以不寫成員變量,系統(tǒng)會自動給我們生成一個 _開頭的成員變量
注意: @property 自動帶我們生成的成員變量 是 一個私有的成員變量, 也就是說是.m文件中生成的,而不是在.h文件中生成的
二、
如果重寫了setter方法,那么property就只會生成getter方法
如果重寫了getter方法,那么property就只會生成setter方法
如果同時 重寫了getter/setter方法,那么@property就不會自動 帶我們生成私有的成員變量
三、注意:
系統(tǒng) 和 @synthesize 有點(diǎn)區(qū)別
系統(tǒng)直接賦值給 _age
而使用 @synthesize age; 系統(tǒng) 則會賦值給 age;
二、code
main.m
#pragma mark 04-property增強(qiáng)
#pragma mark 概念
/*
一、
從Xcode4.4以后 Apple 對 @property進(jìn)行一個增強(qiáng),以后只要利用一個 @property 就可以同時生成 setter 、 getter 方法的聲明 和實(shí)現(xiàn)
沒有告訴 @property 要將傳入的參數(shù)賦值給誰,默認(rèn) @property 會將傳入的屬性 賦值給 _開頭的成員變量
@property 有一個弊端: 他只會生成 最簡單的getter\setter方法的聲明和實(shí)現(xiàn),并不會對傳入的數(shù)據(jù)進(jìn)行過濾
如果想對傳入的數(shù)據(jù)進(jìn)行過濾,那么我們就必須重寫 setter\getter方法
如果不想對傳入的數(shù)據(jù)進(jìn)行過濾,僅僅是提供一個方法給外界操作變量,那么就可以使用
如果利用 @property來生成 getter/setter方法,那么我們可以不寫成員變量,系統(tǒng)會自動給我們生成一個 _開頭的成員變量
注意: @property 自動帶我們生成的成員變量 是 一個私有的成員變量, 也就是說是.m文件中生成的,而不是在.h文件中生成的
二、
如果重寫了setter方法,那么property就只會生成getter方法
如果重寫了getter方法,那么property就只會生成setter方法
如果同時 重寫了getter/setter方法,那么@property就不會自動 帶我們生成私有的成員變量
三、注意:
系統(tǒng) 和 @synthesize 有點(diǎn)區(qū)別
系統(tǒng)直接賦值給 _age
而使用 @synthesize age; 系統(tǒng) 則會賦值給 age;
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Person.h"
#pragma mark - main函數(shù)
int main(int argc, const char * argv[])
{
Person *p = [Person new];
[p setAge:25];
// NSLog(@"age = %i",[p age]);
#pragma 驗(yàn)證系統(tǒng)賦值給那個age? _age?
/*
注意:
系統(tǒng) 和 @synthesize 有點(diǎn)區(qū)別
系統(tǒng)直接賦值給 _age
而使用 @synthesize age; 系統(tǒng) 則會賦值給 age;
*/
// NSLog(@"age = %i, _age = %i",p->age,p->_age);
// p->_age
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
@interface Person : NSObject
/*
{
@public
int _age;
int age;
}
*/
#pragma @property增強(qiáng)
/*
從Xcode4.4以后 Apple 對 @property進(jìn)行一個增強(qiáng),以后只要利用一個 @property 就可以同時生成 setter 、 getter 方法的聲明 和實(shí)現(xiàn)
沒有告訴 @property 要將傳入的參數(shù)賦值給誰,默認(rèn) @property 會將傳入的屬性 賦值給 _開頭的成員變量
@property 有一個弊端: 他只會生成 最簡單的getter\setter方法的聲明和實(shí)現(xiàn),并不會對傳入的數(shù)據(jù)進(jìn)行過濾
如果想對傳入的數(shù)據(jù)進(jìn)行過濾,那么我們就必須重寫 setter\getter方法
如果不想對傳入的數(shù)據(jù)進(jìn)行過濾,僅僅是提供一個方法給外界操作變量,那么就可以使用
如果利用 @property來生成 getter/setter方法,那么我們可以不寫成員變量,系統(tǒng)會自動給我們生成一個 _開頭的成員變量
注意: @property 自動帶我們生成的成員變量 是 一個私有的成員變量, 也就是說是.m文件中生成的,而不是在.h文件中生成的
*/
/*
- (void)setAge:(int)age;
- (int)age;
*/
// 這里不知道賦值給 同名的age 還是 _age?
@property int age;
@end
>>>.m
#import "Person.h"
@implementation Person
/*
{
int _age;
}
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
_age = age;
}
*/
/*
如果重寫了setter方法,那么property就只會生成getter方法
如果重寫了getter方法,那么property就只會生成setter方法
如果同時 重寫了getter/setter方法,那么@property就不會自動 帶我們生成私有的成員變量
*/
- (void)setAge:(int)age
{
if (age < 0) {
age = 0;
}
_age = age;
}
@end