標籤:
一、非ARC記憶體管理問題。
有些同學在建立項目的時候忘記點ARC了,導致一些成員屬性都莫名其妙的釋放了。然後出現了一系列莫名其妙的錯誤。
在滾動UITableView的時候出現野指標錯誤。
一出現這些野指標錯誤,首先應該想到某些對象被釋放了,然後發現代碼中,並沒有什麼造成對象被釋放的情況,這時候應該馬上想到很可能是非ARC弄的。為怎麼查看項目是否是非ARC。
在非ARC中沒有強引用的概念,因此的成員變數是沒有被強引用的。
在看看,allPro數組沒有通過alloc調用,沒有調用alloc產生的對象都是自動釋放的
1 allPro=@[ 2 @{ 3 kCities:@[@"浦東",@"楊浦",@"閘北",@"閔行"], 4 kHeader:@"上海", 5 kFooter:@"上海不錯" 6 }, 7 @{ 8 kCities:@[@"海澱",@"昌平",@"天安門"], 9 kHeader:@"北京",10 kFooter:@"北京很好"11 }12 13 ];
所以在滾動的時候會出現野指標錯誤,因此需要將項目改成ARC。如
兩個勾都得選中,然後一直點確認就OK了。
二、資料模型屬性採用的策略中除了基本類型需要用assign,字串需要用copy,其他物件類型都需要用strong。而控制器中視圖採用的策略需要根據情況而定。
就是資料模型中屬性用錯了策略導致,UITableViewcell重新出現到介面時,會導致資料丟失。
三、想在點擊cell時做些操作,方法選錯了。
下面兩個方法太相似了,很容易選錯。
1 // 當點擊一行cell時,會調用這個方法2 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath3 // 當取消選擇一行cell時,會調用這個方法4 -(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath
四、字串小調試技巧
當把一個字串轉換成基礎資料型別 (Elementary Data Type)時,字串列印有值,但是轉換成基礎資料型別 (Elementary Data Type)為0時,這個莫名其妙的問題,首先應該想到字串中很可能有分行符號合等,導致轉換不成功。
NSString *str = @" 123"; NSInteger i = [str integerValue]; NSLog(@"%@",str);NSLog(@"%d",i);碰到這種情況,可以在列印字串的時候在預留位置兩邊各加一個數字. NSLog(@"1%@1",str);
然後看列印結果就能知道有字串中有多少空行了
只要將空行去掉就能轉換成功了。字串去掉空格的方法:
// 此方法是通過什麼字元集裁剪字串。- (NSString *)stringByTrimmingCharactersInSet:(NSCharacterSet *)set;
NSCharacterSet對象可以通過類方法建立
// 建立空格和換行字元集[NSCharacterSet whitespaceAndNewlineCharacterSet];// 建立空白字元集[NSCharacterSet whitespaceCharacterSet];
五、的警告意思是:初始化時,類型指向不匹配,應該用NSArray * 而不是YZPerson *
找到原因後,然後看person方法是怎麼聲明。
解決方式:將NSArray * 改成id。
六、UITableView資料來源問題
1.1
錯誤原因:說YZViewController 沒有實現 tableView:numberOfRowsInSection:
解決方式:實現tableView:numberOfRowsInSection:
1.2
這裡返回空,會報錯。
UITableView內部實現原理:
資料來源實現了這個方法
1 -(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath2 3 //tableView內部自動會調用以下方法添加cell。4 [tableView addSubview:cell];5 6 //如果返回的cell為空白,也就意味著產生下面一行代碼。7 [tableView addSubview:nil];
而addSubview是將右邊參數添加到數組中儲存起來,而數組是不能添加空值的。所有集合對象都不能出傳空。例如數組,字典,NSSet。
以上錯誤總結:作為tableView的資料來源必須實現兩個方法。
返回行數
-(NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;
返回每一行顯示的內容
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
另外返回每一行顯示的內容不能返回nil。
七、在數組刪除一個模型,並不代表把這個模型給釋放了。
上面步驟二,僅僅是將模型從數組中銷毀,而模型並沒有被銷。
八、stroyboard中顯示的跟根視圖是UIView,而stroyboard的控制器是UITableViewController就會報這個錯誤
原因是:UITableViewController控制器不能載入UITableView,因為它會去載入stroyboard中的UIView。
解決方式:將stroyboard中的UIView改成UITableView
九、自訂視圖的屬性命名衝突問題
當發現自己描述的xib和啟動並執行時候展現出來的不一樣的時候,這時候已經想到自己命名的屬性名稱和系統命名的衝突了。
錯誤原因:
系統內建的UITableViewCell中也有imageView這個屬性,因此衝突了。
解決辦法:將自訂視圖的imageView屬性名稱改成iconView.
注意:以後自訂屬性命名不要和系統內建的屬性名稱相同。
十、連結錯誤
以後看到duplicate這個詞語,錯誤原因就是重複定義了類,函數方法等等。
一般都是因為匯入了.m檔案
錯誤:
解決方式:將#import "newsCell.m"這一行刪掉。
iOS常見問題(4)