- 不要等到明天,明天太遙遠,今天就行動。
須讀:看完該文章你能做什么?
對property關鍵字的修飾符,深刻理解.對于修飾符的<底層原理>有一個深刻了解
學習前:你必須會什么?(在這里我已經默認你具備C語言的基礎了)
1.property關鍵字是用來干什么的,
2.synthesize關鍵字是用來干什么的
3.property在Xcode4.4之后都干了些什么
1.編譯器只要看到 @property, 就知道我們要生成某一個屬性的 getter/setter方法的聲明
2.synthesize 是一個編譯器指令,它可以簡化 我們getter/setter方法的實現
3.從Xcode4.4以后 Apple 對 @property進行一個增強,以后只要利用一個 @property 就可以同時生成 setter 、 getter 方法的聲明 和實現
一、本章筆記
一、setter方法內存管理
1.判斷傳入的對象 和當前的對象是否一樣
2.release 以前對象
3.retain 傳入的對象
二、property關鍵字的修飾符
readonly : 只會生成getter方法
readwrite : 即會生成getter 也會生成 setter, 默認什么都不寫 就是readwrite
getter : 可以給生成的getter方法 起一個名稱
setter : 可以給setter方法 起一個名稱
retain : 就會自動給我們 生成setter/getter方法 內存管理的代碼
assign : 不會幫我們生成 setter方法內存管理的代碼, 僅僅只會生成 普通 getter/ setter方法, 默認什么不寫 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多線程
atomic : 性能低(默認)
nonatomic : 性能高
在iOS開發中 99% 都是些 nonatomic
三、
1.相同類型的property修飾符 不能同時使用
2.不同類型的property修飾符 可以多個結合在一起使用, 多個之間用,隔開
3.iOS開發 只要寫上property ,那么就立刻寫上 nonatomic
二、code
main.m
#pragma mark 07-property修飾符
#pragma mark 概念
/*
一、setter方法內存管理
1.判斷傳入的對象 和當前的對象是否一樣
2.release 以前對象
3.retain 傳入的對象
二、property關鍵字的修飾符
readonly : 只會生成getter方法
readwrite : 即會生成getter 也會生成 setter, 默認什么都不寫 就是readwrite
getter : 可以給生成的getter方法 起一個名稱
setter : 可以給setter方法 起一個名稱
retain : 就會自動給我們 生成setter/getter方法 內存管理的代碼
assign : 不會幫我們生成 setter方法內存管理的代碼, 僅僅只會生成 普通 getter/ setter方法, 默認什么不寫 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多線程
atomic : 性能低(默認)
nonatomic : 性能高
在iOS開發中 99% 都是些 nonatomic
三、
1.相同類型的property修飾符 不能同時使用
2.不同類型的property修飾符 可以多個結合在一起使用, 多個之間用,隔開
3.iOS開發 只要寫上property ,那么就立刻寫上 nonatomic
*/
#pragma mark - 代碼
#import <Foundation/Foundation.h>
#pragma mark 類
#import "Person.h"
#pragma mark - main函數
int main(int argc, const char * argv[])
{
Person *p = [Person new];
Room *r = [Room new];
Car *c = [Car new];
Dog *d = [Dog new];
p.room = r;
[r release];
/*
p.car = c;
p.dog = d;
[d release];
[c release];
[r release];
[p release];
*/
#pragma mark setter方法內部的內存管理兩種情況
// 換房了
// Room *r2 = [Room new];
// p.room = r2;
// [r2 release];
// 重復賦值
p.room = r;
/*
通過 是用retain的修飾符驗證
retain 內部是這樣做的
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
*/
[p release];
return 0;
}
Person
>>>.h
#import <Foundation/Foundation.h>
#import "Room.h"
#import "Car.h"
#import "Dog.h"
@interface Person : NSObject
{
Room *_room;
Car *_car;
Dog *_dog;
}
/*
- (void)setRoom:(Room *)room;
- (void)setCar:(Car *)car;
- (void)setDog:(Dog *)dog;
- (Room *)room;
- (Car *)car;
- (Dog *)dog;
*/
/*
readonly : 只會生成getter方法
readwrite : 即會生成getter 也會生成 setter, 默認什么都不寫 就是readwrite
getter : 可以給生成的getter方法 起一個名稱
setter : 可以給setter方法 起一個名稱
retain : 就會自動給我們 生成setter/getter方法 內存管理的代碼
assign : 不會幫我們生成 setter方法內存管理的代碼, 僅僅只會生成 普通 getter/ setter方法, 默認什么不寫 就是assign
- (void)setAge:(int)age;
- (int)age;
- (void)setAge:(int)age
{
_age = age;
}
- (int)age
{
retrun _age;
}
多線程
atomic : 性能低(默認)
nonatomic : 性能高
在iOS開發中 99% 都是些 nonatomic
*/
//@property(retain) int age;
#pragma property 修飾符
//@property(retain) Room *room;
// 1.相同類型的property修飾符 不能同時使用
// 2.不同類型的property修飾符 可以多個結合在一起使用, 多個之間用,隔開
// 3.iOS開發 只要寫上property ,那么就立刻寫上 nonatomic
@property(nonatomic,retain) Room *room;
@end
>>>.m
#import "Person.h"
@implementation Person
/*
setter方法內存管理
1.判斷傳入的對象 和當前的對象是否一樣
2.release 以前對象
3.retain 傳入的對象
*/
/*
- (void)setRoom:(Room *)room
{
if (_room != room) {
[_room release];
_room = [room retain];
}
}
- (void)setCar:(Car *)car
{
if (_car != car) {
[_car release];
_car = [_car retain];
}
}
- (void)setDog:(Dog *)dog
{
if (_dog != dog) {
[_dog release];
_dog = [_dog retain];
}
}
- (Room *)room
{
return _room;
}
- (Car *)car
{
return _car;
}
- (Dog *)dog
{
return _dog;
}
*/
- (void)dealloc
{
[_room release];
[_car release];
[_dog release];
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Room
>>>.h
#import <Foundation/Foundation.h>
@interface Room : NSObject
@end
>>>.m
#import "Room.h"
@implementation Room
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Car
>>>.h
#import <Foundation/Foundation.h>
@interface Car : NSObject
@end
>>>.m
#import "Car.h"
@implementation Car
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end
Dog
>>>.h
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@end
>>>.m
#import "Dog.h"
@implementation Dog
- (void)dealloc
{
NSLog(@"%s",__func__);
[super dealloc];
}
@end