您好,登錄后才能下訂單哦!
[TOC]
assign 簡(jiǎn)單的指針賦值,不涉及引用計(jì)數(shù)的操作。
copy 產(chǎn)生一個(gè)新對(duì)象,引用計(jì)數(shù)為1,老對(duì)象引用計(jì)數(shù)不變。
retain 對(duì)象的引用計(jì)數(shù)加1。
weak 自動(dòng)引用計(jì)數(shù)環(huán)境下使用,與assign類(lèi)似,但是當(dāng)對(duì)象釋放后會(huì)自動(dòng)置為nil。
strong 自動(dòng)引用計(jì)數(shù)環(huán)境下使用,類(lèi)似于retain,強(qiáng)引用的對(duì)象不會(huì)被釋放。
center和frame是指視圖在父視圖的坐標(biāo)系統(tǒng)中的表示,center表示UIView的中心點(diǎn)在父視圖坐標(biāo)系統(tǒng)中的位置,frame表示UIView在父視圖坐標(biāo)系統(tǒng)中的位置和大小。bounds表示視圖在它本身的坐標(biāo)系統(tǒng)中的位置。如果修改bounds的origin會(huì)導(dǎo)致該視圖的子視圖位置發(fā)生改變,但不會(huì)影響視圖本身的位置。一般來(lái)說(shuō),frame是由center和bounds計(jì)算得來(lái)?;蛘呤钦f(shuō)UIView的frame由它所擁有的CALayer的position、anchorPoint和bounds決定。
Ball *ball = [[[[Ball alloc] init] autorelease] autorelease];
給對(duì)象發(fā)送一次autorelease
消息就會(huì)將它在自動(dòng)釋放池中注冊(cè)一次。當(dāng)自動(dòng)釋放池release
或者drain
的時(shí)候,將給注冊(cè)到里面的對(duì)象按注冊(cè)的次數(shù)發(fā)送release
消息。因此最后ball
對(duì)象會(huì)接收到兩次release
消息,由于ball
的引用計(jì)數(shù)為1,當(dāng)接收第一次release
后就被釋放了。第二次release
的時(shí)候會(huì)導(dǎo)致程序崩潰。
KVC是由NSKeyValueCoding非正式協(xié)議所實(shí)現(xiàn)的一種機(jī)制,使得應(yīng)用程序可以通過(guò)名字或Key來(lái)訪問(wèn)對(duì)象的屬性,而不是直接調(diào)用訪問(wèn)器或者實(shí)例變量。 示例代碼:
// Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//
#import
@class DVIDog;
@interface DVIStudent : NSObject
{
@public
NSString *_name;
@protected
NSString *_studentID;
@private
float _height;
}
//_age
@property (nonatomic, assign) int age;
@property (nonatomic, strong) DVIDog *dog;
@property (nonatomic, strong) NSMutableArray *dogsArray;
- (void)printInfo;
- (void)setValueFromDict:(NSDictionary *)dict;
@end
類(lèi)的實(shí)現(xiàn):
//
// DVIStudent.m
// KVCSample
//
// Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//
#import "DVIStudent.h"
#import "DVIDog.h"
@implementation DVIStudent
- (id)init
{
if (self = [super init]) {
_dogsArray = [NSMutableArray array];
}
return self;
}
@synthesize age = _age;
- (void)printInfo
{
NSLog(@"%@:%@:%d:%f", _name, _studentID, _age, _height);
}
- (void)setValueFromDict:(NSDictionary *)dict
{
_name = [dict objectForKey:@"name"];
_age = [[dict objectForKey:@"age"] intValue];
_height = [[dict objectForKey:@"height"] floatValue];
_studentID = [dict objectForKey:@"studentID"];
}
- (void)setValue:(id)value forUndefinedKey:(NSString *)key
{
NSLog(@"%@:%@", key, value);
}
- (void)setNilValueForKey:(NSString *)key
{
NSLog(@"%@", key);
}
- (void)setAge:(int)age
{
NSLog(@"age: %d", age);
_age = age;
_height += 0.1;
}
- (int)age
{
return _age;
}
@end
第二個(gè)類(lèi):
// Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//
#import
@interface DVIDog : NSObject
@property (nonatomic, assign) int weight;
@end
第二個(gè)類(lèi)的實(shí)現(xiàn):
// Copyright (c) 2014年 戴維營(yíng)教育. All rights reserved.
//
#import "DVIDog.h"
@implementation DVIDog
@end
使用KVC訪問(wèn)屬性:
_student = [[DVIStudent alloc] init];
// student.age = 20;
[_student setValue:@20 forKey:@"age"];
_student->_name = @"Zhangsan";
//1. _key
//2. key
[_student setValue:@"1001" forKey:@"studentID"];
[_student setValue:@1.7 forKey:@"height"];
[_student printInfo];
NSLog(@"%@", [_student valueForKey:@"age"]);
NSDictionary *dict = @{@"name":@"Lisi",@"studentID":@"2002",@"age":@33,@"height":@1.8};
[_student setValueFromDict:dict];
[_student printInfo];
dict = @{@"name":@"Wangwu",@"studentID":@"3002",@"age":@23,@"height":@0.8};
[_student setValuesForKeysWithDictionary:dict];
[_student printInfo];
DVIDog *dog = [[DVIDog alloc] init];
_student.dog = dog;
_student.dog.weight = 20;
[_student setValue:@30 forKeyPath:@"dog.weight"];
NSLog(@"%@", [_student valueForKeyPath:@"dog.weight"]);
[_student setValue:@12 forKey:@"weight"];
[_student setNilValueForKey:@"age"];
NSLog(@"%@", [_student valueForKey:@"age"]);
KVC中除了訪問(wèn)單個(gè)屬性外,還能夠?qū)蠈傩赃M(jìn)行訪問(wèn)和操作:
for (int i = 0; i <</span> 100; ++i) {
DVIDog *dog = [[DVIDog alloc] init];
dog.weight = i;
[_student.dogsArray addObject:dog];
}
//
NSLog(@"%@", [_student valueForKeyPath:@"dogsArray.@count"]);
常用的集合操作:
bash @avg, @max, @min, @count, @sum等
在KVC的基礎(chǔ)上,蘋(píng)果提供了KVO來(lái)獲取屬性改變的事件: 添加KVO觀察者:
[_student addObserver:self forKeyPath:@"name" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld |NSKeyValueObservingOptionPrior context:nil];
觀察者獲取通知:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
NSLog(@"%@: %@: %@", keyPath, object, change);
_nameLabel.text = [change objectForKey: NSKeyValueChangeNewKey];
}
5. 舉例說(shuō)明幾個(gè)常用的Xcode環(huán)境變量。
$(BUILT_PRODUCTS_DIR) 構(gòu)建成功后,目標(biāo)文件存放的位置。
$(TARGET_NAME) 目標(biāo)工程名。
$(SRCROOT) 工程文件存放的位置。
$(CURRENT_PROJECT_VERSION) 當(dāng)前工程版本號(hào)。
不應(yīng)該對(duì)一個(gè)對(duì)象進(jìn)行強(qiáng)引用。代理對(duì)象可能對(duì)被代理對(duì)象擁有強(qiáng)引用,如UITableViewController對(duì)它里面的tableView的引用。如果tableView的代理也是強(qiáng)引用的話,就會(huì)導(dǎo)致因?yàn)檠h(huán)引用而出現(xiàn)內(nèi)存泄漏。
NSObject <- UIResponder <- UIView <- UIControl <- UIButton
@synthesize 編譯器自動(dòng)生成setter和getter。 @dynamic 需要手工實(shí)現(xiàn)setter和getter,并且不能在后面用=
號(hào)標(biāo)明對(duì)應(yīng)的實(shí)例變量。 @compatibility_alias 給類(lèi)起別名。
@compatibility_alias DVINewStudent DVIStudent;
@encode 獲取類(lèi)型的字符串,可以用來(lái)判斷類(lèi)型。
@encode(int) //i
@encode(CGRect) //{CGRect={CGPoint=ff}{CGSize=ff}}
@encode(DVIStudent) //{DVIStudent=#}
給對(duì)象發(fā)送延時(shí)執(zhí)行的消息會(huì)對(duì)對(duì)象進(jìn)行retain
操作,并且在方法執(zhí)行完后進(jìn)行release
操作。
NSCoder是一個(gè)抽象的基類(lèi),為子類(lèi)定義了在對(duì)象和其它Objective-C數(shù)據(jù)在內(nèi)存和其它格式直接進(jìn)行轉(zhuǎn)換的能力,是歸檔(將對(duì)象和數(shù)據(jù)存放到磁盤(pán))和分發(fā)(在進(jìn)程和線程直接進(jìn)行數(shù)據(jù)傳遞)的基礎(chǔ)。在基礎(chǔ)框架(Foundation)中提供了NSKeyedArchiver、NSKeyedUnArchiver等子類(lèi)。NSCoder可以操作對(duì)象、標(biāo)量、C語(yǔ)言數(shù)組、結(jié)構(gòu)體、字符串等,但是不支持聯(lián)合體、void指針、函數(shù)指針等與平臺(tái)實(shí)現(xiàn)相關(guān)的數(shù)據(jù)類(lèi)型。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。