iOS常見問題(4)

來源:互聯網
上載者:User

標籤:

一、非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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.