OC中的類簇的使用和初始化方法中屬性的使用

2022-08-02 18:27:09 字數 1493 閱讀 5182

今天遇到了幾個和字串相關的記憶體問題,和大家分享一下

nsstring *name = [[nsstring alloc]initwithstring:@"張三"];

nslog(@"%d",[name retaincount]);

這兩行**的列印結果是-1,

nsstring * astring = [[nsstring alloc] initwithformat:@"123"]; 

nslog(@"%d",astring.retaincount);

這兩行**的列印結果也是-1

nsstring * astring = [[nsstring alloc] initwithformat:@"1233sfsf4545f"]; 

nslog(@"%d",astring.retaincount);

當就字串變為上面所述時,列印結果變為了1

的結果會是不同呢?反過來分析,列印結果是-1說明引用指向的是常量區的字串,列印結果是1指向的是堆區的字串。由於oc是不開源的,內部的實現我們不得而知,但是從中我們至少可以猜測,oc中對不同大小的字串是由不同的方法的。

initwithstring產生的是將指標指向了常量區的字串,是無法被release的,如果使用dealloc進行摧毀會報錯。其一:不能手動調

用dealloc方法

再者蘋果官方文件中說的很清楚,建立的物件和retain的物件為自己所保有,這些物件全部都是在堆區的。靜態區的記憶體實在編譯時就分配好了的,它的記憶體

位址非常靠前,而且在程式執行的整個階段都存在,所以我們不能釋放。

關於類簇(class

cluster)大家舉得最多的例子就是nsnumber類,其實nsnumber類是乙個抽象的超類,內部有很多的具體的子類,如nsint

nsdouble等,它們對應不同的初始化方法,也就是說nsnumber的不同初始化方法返回的型別是不同的。不僅nsnumber,nsstring

也是如此,

// 類簇的使用

idsomeclass = [nsstringalloc]; // 返回的物件型別:nsplaceholderstring

nsstring*string1 = [[nsstringalloc] init]; // 返回的物件型別:__nscfconstantstring

nsstring*string2 = [[nsstringalloc] initwithformat:@"string2"]; // 返回的物件型別:__nscfstring

nslog(@"%@", string1);

nslog(@"%@", string2);

,而又不減少功能的豐富性

我們在專案中肯定會遇到類的初始化方法傳參的情況,如果實在mrc模式下,如何保證記憶體不leak,蘋果的官方文件做了如下推薦

- (id)initwithname:(nsstring*)name

使用self.name = name;其實和上面是相同的

本文出自 「愛生活不愛bug」 部落格,請務必保留此出處

OC中的類簇

類簇 class cluster 是一種設計模式,在foundation framework中被廣泛使用,舉個簡單的例子 nsarray arr nsarray arraywithobjects foo bar nil nslog arr class arr class output nsarray...

類的初始化和例項的初始化

有如下兩個類 father 父類 package com.yzx.test01 父類物件 父類初始化 1 j method 5 2 父類的靜態 塊 1 父類的例項化方法 1 super 最前 2 i test 3 父類的非靜態 塊 4 父類的無參構造 最後 非靜態方法前面其實有乙個預設物件this ...

類的初始化和例項的初始化

執行結果 一 初始main方法所在的類,有父類先初始化父類,初始屬性和構造方法,執行順序與 順序一致 5 1 10 6 二 物件son初始化 1 呼叫super 載入父類f非靜態的物件,屬性與 塊按順序,構造器最後執行,順序如下 i test 實際執行子類重寫的物件 9 呼叫父類非靜態 塊 3 載入...