1設置圖片的拉伸點
_bgImgView.image = [_bgImgView.image stretchableImageWithLeftCapWidth:100 topCapHeight:29];
2獲取tableView內(nèi)容總高度,適用于tableView中每一個cell高度不同,而你有需要在外部知道tableView的高度的情況下。
[tableView layoutIfNeeded];
CGFloat tableHeight =? tableView.contentSize.height;
3刪除字符串特殊字符
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:@"\n"];
NSString *trimmedString = [content stringByTrimmingCharactersInSet:set];
4強引用和弱引用。什么時候用Weak什么時候用assign
強引用,strong意思是在我們不希望對象的銷毀由是否被其他對象所引用來決定的時候,我們采用強引用,也就是說當我們強引用某個對象時,此對象的retainCount+1,當retainCount = 0的時候,此對象才會被銷毀,由于我們需要對對象進行內(nèi)存管理,所以默認是強引用。
當對象的生命周期不被其他對象引用是否引用限制的時候,采用弱引用,他該什么時候銷毀,就在什么時候銷毀。即便還有對象引用它,但它的生命周期已經(jīng)結束就會被銷毀。
weak和assign的用法基本相同。區(qū)別在于weak必須是oc對象。并weak屬于歸零弱引用,當對象被銷毀之后指針置nil。在需要放置循環(huán)引用的時候,通過一端采用weak來解決。
5關于Copy和strong的區(qū)別
在MRC模式下,對block的修飾用copy,在ARC模式下,效果相同。
在屬性修飾的時候,通常NSString,NSArray,NSDictionary使用copy來修飾,這是因為它們的子類對應有可變的類型,他們可以動態(tài)的進行賦值操作。所以如果我們需要保證字符串或數(shù)組的值不被改變,就需要將其完全復制一份,成為不可變的類型保存起來。
copy是深復制,strong是淺復制。
@property(copy,nonatomic)NSString * string;
如果這個時候有一個可變字符串NSMutableString *mStr;
mStr = @"我是一個可變的字符串"
string = mStr;
mStr = @"我現(xiàn)在重新賦值了一次";
此時如果沒有使用copy進行修飾,string的值會變成“我現(xiàn)在重新賦值了一次”,所以當我們不希望修飾的string的值被改變的時候,應當用copy修飾。
另外一種情況,那么當我們需要修飾可變的類型的時候,使用copy還是strong呢?
比如@property(copy,nonatomic)NSMutableArray *mArr;
NSMutableArray*copyArray ?= [NSMutableArray array];
mArr= copyArray;相當月mArr= [copyArray copy];
由于使用copy修飾,那么此時mArr被深復制為一個不可變的數(shù)組,這個時候可變數(shù)組的一些方法,在NSArray中是沒有的,當找不到這些可變數(shù)組中獨有的實例方法的時候,就會報錯。所以當修飾可變類型的時候,使用Strong修飾,因為不會深復制一個新的對象。
6關于NSUserDefault如何保存自定義對象
NSUserdefault是經(jīng)常使用的數(shù)據(jù)持久化方法,它的操作非常簡單,對于它能夠接受的類型的存儲和讀取都非常方便,但是如果我們需要保存自己自定義的對象時,該如何使用NSUserDefault?
比如我們要保存一個類,而這個類中有兩個屬性,年齡和名字,這個時候如果想要把這個類保存在NSUserDefault中就需要做一些特殊的處理。
首先在自定的這個類中,比如是student,我們需要申明NSCoding協(xié)議,然后在.m文件中按照NSCoder的要求對這個類進行歸檔,將類型轉換為NSData格式。然后再將其存入NSUserDefault中。
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.InsureSolutionID forKey:@"personName"];
[aCoder encodeObject:self.InsureSolutionName forKey:@"personAge"];
}
-(id)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self)
{
self.InsureSolutionID= [aDecoder decodeObjectForKey:@"personName"];self.InsureSolutionName= [aDecoder decodeObjectForKey:@"personAge"];
}
return self;
}
最后將這個類轉化為NSData
NSData *archiveCarPriceData = [NSKeyedArchiver archivedDataWithRootObject:self.student];
然后將archiveCarPriceData存入NSUserDefault。