一點(diǎn)一滴,編程人生

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            69 隨筆 :: 0 文章 :: 25 評(píng)論 :: 0 Trackbacks

          2012年6月26日 #

          今天為了這個(gè)問題了忙乎了一整天,特此記錄下,希望對(duì)有遇到同樣問題的同學(xué)有幫助。事情的經(jīng)過是這樣的,原先使用atomikos一直把數(shù)據(jù)源用jndi配置到tomcat的context.xml下,一直這么用沒有出現(xiàn)問題,配置如下
              <Resource name="jdbc/cms" auth="Container"
                  type
          ="com.atomikos.jdbc.AtomikosDataSourceBean" factory="com.atomikos.tomcat.EnhancedTomcatAtomikosBeanFactory"
                  uniqueResourceName
          ="jdbc/cms" xaDataSourceClassName="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"
                  xaProperties.URL
          ="xxxx"
                  xaProperties.user
          ="xxxx" xaProperties.password="xxxx"
                  xaProperties.pinGlobalTxToPhysicalConnection
          ="true" maxLifetime="60" poolSize="4" />

          最近項(xiàng)目要遷移到maven下,所以把context.xml的數(shù)據(jù)源配置挪到了spring.xml下,配置如下
              <bean id="myDataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean" init-method="init" destroy-method="close">
                 
          <property name="uniqueResourceName" value="masterDB" />
                 
          <property name="xaDataSourceClassName" value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource"/>  <!-- SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase, Hana]  -->  
                 
          <property name="poolSize" value="0" /> 
                 
          <property name="minPoolSize" value="0"/>    
                 
          <property name="maxPoolSize" value="9"/>    
                 
          <property name="borrowConnectionTimeout" value="60"/>    
                 
          <property name="reapTimeout" value="20"/>    
                 
          <property name="maxIdleTime" value="60"/>    
                 
          <property name="maintenanceInterval" value="60"/>    
                 
          <property name="loginTimeout" value="60"/>
                 
          <property name="xaProperties">  
                      
          <props>
                          
          <prop key="url">xxxx</prop>  
                          
          <prop key="user">xxxx</prop>
                          
          <prop key="password">xxxx</prop>
                      
          </props>
                  
          </property>  
              
          </bean>
          因?yàn)樯厦孢@個(gè)配置我是照搬網(wǎng)上的,所以覺得沒有問題,可是項(xiàng)目啟動(dòng)后,用此數(shù)據(jù)源提交事務(wù)時(shí)確報(bào)以下錯(cuò)誤:

          Raised -5: invalid arguments were given for the XA operation 或 XAER_INVAL: Invalid arguments (or unsupported command)

          一開始我以為maven配置的mysql-connector-java驅(qū)動(dòng)版本不對(duì),或是atomikos版本不對(duì),可是不管如何換版本都不行,就快要瘋了的時(shí)候,我看到了原先jndi方式中有這么一行代碼
          xaProperties.pinGlobalTxToPhysicalConnection="true"
          就因?yàn)槿鄙偕厦孢@句話導(dǎo)致了問題,上網(wǎng)查資料,據(jù)說是mysql xa bug,有興趣的可以看如下連接,最后配置如下:
                 <property name="xaProperties">  
                      
          <props>
                          
          <prop key="pinGlobalTxToPhysicalConnection">true</prop>  <!-- mysql必須配置此參數(shù),要不然無法提交事務(wù) -->
                          
          <prop key="url">xxxx</prop>  
                          
          <prop key="user">xxx</prop>
                          
          <prop key="password">xxxx</prop>
                      
          </props>
                  
          </property> 



          posted @ 2017-06-28 19:32 writegull 閱讀(2506) | 評(píng)論 (0)編輯 收藏

          事情描述:
          本人在阿里云上創(chuàng)建了一個(gè)linux服務(wù)器,跑了一個(gè)自己的測試web項(xiàng)目。搭建了redis。想方便測試用,就沒有對(duì)redis進(jìn)行任何安全防護(hù)并暴露在了公網(wǎng)上。期間阿里云發(fā)現(xiàn)了此問題,還發(fā)短信提醒我,由于最近在公司一直加班也沒有時(shí)間理會(huì),沒想到就在今天真的被黑了,事后心想多虧是個(gè)測試服務(wù)器,如果是正式環(huán)境,也真危險(xiǎn),這個(gè)黑客也沒有停下腳步,通過redis強(qiáng)大的能力在/root/.ssh目錄下面上傳了公鑰,徹底攻破了服務(wù)器,免密碼登錄服務(wù)器,一般黑客到這步也就看看有沒有興趣的數(shù)據(jù),這個(gè)黑客一看這就是個(gè)沒有價(jià)值的測試服務(wù)器,所以心一橫,在我這上面裝了個(gè)DDOS攻擊軟件,把我的機(jī)器當(dāng)起肉雞。

          1.這就是黑完后留下的公鑰/私鑰,刪除authorized_keys,id_rsa, id_rsa.pub這三個(gè)文件吧,除非還想讓他繼續(xù)黑下去。。。。


          2.通過redis的key *命令可以看到有個(gè)叫crackit的key。這就是黑客在入侵后留下來的,原先set的值是公鑰,入侵成功之后就改成這個(gè)了,把這個(gè)key也刪除掉吧。


          3.修改redis默認(rèn)端口吧,不讓黑客利用6379端口。在redis安裝目錄中,修改redis.config文件。修改完了別忘了重啟redis服務(wù),

          # redis-server /etc/redis/redis.conf 開啟

          # redis-cli shutdown 關(guān)閉



          4.重啟后查看redis是否運(yùn)行
          ps -x | grep redis
          5.通過指定端口訪問redis。
          redis-cli -p 6666

          6.給redis設(shè)置密碼或者干脆設(shè)置成只能內(nèi)網(wǎng)訪問

          7.通過top命令發(fā)現(xiàn)了幾個(gè)可疑的程序



          8.minerd這個(gè)程序是個(gè)用來挖掘萊特幣的,這個(gè)黑客看來干了不少壞事啊。。我們用命令 ps -ef|grep minerd 查找一下這個(gè)進(jìn)程,殺掉這個(gè)進(jìn)程kill -9 18267,并且去/tmp目錄刪除minerd目錄


          9.黑客在tmp目錄留下了一個(gè)叫1.sh的腳本,是用來下載挖掘萊特幣程序的。也把它kill掉吧。以下是腳本內(nèi)容。


          10.通過cat /etc/passwd命令可以看到有一個(gè)叫作syss的非法用戶,權(quán)限還很高,跟root一樣,刪掉他吧,這是黑客入侵后方便進(jìn)入的。使用命令userdel -f syss 強(qiáng)制刪除一個(gè)用戶,哪怕他正在登錄。


          11.去/mnt目錄上,可以看到黑客掛載了很多程序,刪除他們吧。


          12.通過nethogs軟件可以按進(jìn)程實(shí)時(shí)統(tǒng)計(jì)網(wǎng)絡(luò)帶寬利用率,這個(gè)用來看是否存在DDOS攻擊最好不過了。

          13.暫時(shí)解決對(duì)外DDOS攻擊,最快的辦法就是用防火墻,這個(gè)阿里云提供的腳本幫了大忙。直接上傳到服務(wù)器上,運(yùn)行一下世界就清靜了。下載地址:
          https://help.aliyun.com/knowledge_detail/5973920.html?spm=5176.7618386.5.1.H8H33f

           
          posted @ 2015-12-15 01:13 writegull 閱讀(4133) | 評(píng)論 (4)編輯 收藏

          今天在修改server.xml調(diào)試程序時(shí),遇到下面這個(gè)問題,clean,重啟都不好使。

                          Removing obsolete files from server..
                         Could not clean server of obsolete files: null
                          java.lang.NullPointerException
          解決方法是把.metadata\.plugins\org.eclipse.wst.server.core這個(gè)目錄下面的tmp0刪除掉,再clean下就可以了。可能是緩存問題。
          posted @ 2015-01-03 16:58 writegull 閱讀(7292) | 評(píng)論 (0)編輯 收藏

          有時(shí)候需要手動(dòng)地去禁用一個(gè)uibutton,使用button.enabled = NO的時(shí)候雖然能夠達(dá)到目的但也會(huì)帶來副作用,那就是按鈕變的半透明了。有時(shí)候應(yīng)用不需要這種副作用,可以嘗試使用button.userInteractionEnabled = NO來達(dá)到這個(gè)目的,在禁用按鈕的同時(shí)也不會(huì)使得按鈕變得半透明。
          posted @ 2013-12-23 10:29 writegull 閱讀(610) | 評(píng)論 (0)編輯 收藏

          裝win8后發(fā)現(xiàn)cpu占用率50%-60%,而且磁盤瘋狂讀寫,是com surrogate這個(gè)程序,還有幾個(gè)服務(wù)造成的,之后我把com surrogate結(jié)束進(jìn)程了cpu使用率直接降低到10%以下,我就郁悶了。
          解決方案:
          1,在“更多電腦設(shè)置”那里的“用戶”改為“本地用戶”。
          2,“離開”家庭組(一般都是它的原因)
          3,“同步設(shè)置”關(guān)
          4,一般“共享”什么的不到需要都是“關(guān)”的狀態(tài)。
          5,做完以上幾點(diǎn)都不行,就真幫不了你了。
          posted @ 2013-03-18 22:47 writegull 閱讀(403) | 評(píng)論 (0)編輯 收藏

          這個(gè)問題似乎只有在手動(dòng)改變系統(tǒng)狀態(tài)欄級(jí)別的情況才會(huì)出現(xiàn)

          例如:self.window.windowLevel = UIWindowLevelStatusBar+1;

          這樣設(shè)置的話相當(dāng)于影響了彈出短信或郵件控制器頁面window的級(jí)別,所以造成不顯示鍵盤問題(不過此問題在ios6以下沒有)

          解決方法:在當(dāng)前視圖控制器中加入下面的代碼,即可解決

          - (void) viewDidAppear:(BOOL)animated {

              [super viewDidAppear:animated];

              self.window.windowLevel = UIWindowLevelNormal;

          }

          posted @ 2012-10-30 21:08 writegull 閱讀(1587) | 評(píng)論 (1)編輯 收藏

          原文地址:http://blog.csdn.net/pjk1129/article/details/7255163

          最近在做Apple的IOS開發(fā),有開發(fā)靜態(tài)庫的需求,本身IOS的開發(fā),只允許靜態(tài)庫或者Framework。在Xcode上沒有找到允許編譯,如同Android上的*.so和Win32上的dll這樣的說法。不過Framework這樣的框架,估計(jì)也是類似動(dòng)態(tài)庫的實(shí)現(xiàn),不過沒有具體研究過,后續(xù)繼續(xù)深入研究。

          我這個(gè)文檔的靜態(tài)庫的開發(fā)是基于Xcode4.2和iOS SDK5.0編寫的。Xcode4跟之前的Xcode3還是有不少的差別的。

          下面就簡單寫一個(gè)靜態(tài)庫和一個(gè)調(diào)用靜態(tài)庫的例子。

          靜態(tài)庫的編寫:

          1.靜態(tài)庫工程的建立:

          Xcode New一個(gè)新的project,選擇IOS下面的Framework&Library,下面有一個(gè)Cocoa Touch Static Library。直接next去建立一個(gè)Print這樣的工程。


          2.工程建立

          我們添加很簡單的"- (void)printA;"和"+ (void)printB;"的方法,這個(gè)方法的實(shí)現(xiàn)也是很簡單的,在*.m文件中的實(shí)現(xiàn)就是一個(gè)"NSLog(@“”);"這樣我們編譯出來的libstaticlib就可以被其他的IOS工程進(jìn)行調(diào)用了。這塊注意一下,目前我們的Print->iOS Device



          3.編譯前準(zhǔn)備

          這里分release與debug版本,需要設(shè)置一下


          4.OK,編譯

          我們可以在Products下面找到我們編譯生成的libstaticlib.a這個(gè)文件。

          注意未編譯前為紅色:左                             編譯后為黑色: 右

                 

          5.ok

          在右邊 這個(gè)文件上右鍵Open In Finder。這時(shí)候我們打開了一個(gè)文件夾,里面有一個(gè)libPrint.a。后面我們繼續(xù)編寫一個(gè)調(diào)用這個(gè)libPrint.a的App。但是這個(gè)App在編譯時(shí)候會(huì)出錯(cuò),通過這個(gè)錯(cuò)誤的解決,說明Xcode的一些編譯相關(guān)的東西。這里,我們?cè)赾ommand下面根據(jù)路徑找到這個(gè)文件,用這個(gè)非常重要的命令查看一下這個(gè)lib的信息!

          打開終端寫入如下命令:這是什么?這就是所在的路徑 

          以下均是在自己的mac上的路徑。你需要將/Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/ 替換成你的路徑。

          cd /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/  

          我們手動(dòng)打開這個(gè)路徑:可以看到如下信息:Release-iphoneos


          這個(gè)是給真機(jī)用的,那我們要給模擬器和真機(jī)封裝的靜態(tài)庫應(yīng)該都能用才好。這個(gè)下面介紹!!!!!  


          然后再在終端 打開這個(gè)文件:cd /Users/user/Library/Developer/Xcode/DerivedData/UItab-dbvoszbzpavyglaboxgflvrnzfce/Build/Products/Debug-iphoneos

          命令是:lipo -info libPrint.a,可以看到顯示的結(jié)果是:Arch是  Arm7。下面我會(huì)具體介紹一下。


          6.建立一個(gè)調(diào)用這個(gè)libPrint.a的應(yīng)用

          應(yīng)用就很簡單了,我們添加剛才libPrint.a的*.h文件。 然后在這個(gè)工程的Build Phases的Link Binary With Library里面添加我們剛才拷貝出來的那個(gè)libPrint.a。



          7.插入了h和a文件后

          我們就可以在control里面調(diào)用這個(gè)libPrint.a 函數(shù)了。

          #import "AstroDiskAppDelegate.h"

          #import "Print.h"


          @implementation AstroDiskAppDelegate


          @synthesize window = _window;


          - (void)dealloc

          {

              [_window release];

              [_viewController release];

              [super dealloc];

          }


          - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

          {

              

              //調(diào)用libPrint.a

              [Print printB];

              Print  *print = [[[Print alloc] init] autorelease];

              [print printA];


              self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

              [self.window makeKeyAndVisible];

              return YES;

          }


          8.OK,編譯運(yùn)行這個(gè)應(yīng)用程序。

          編譯出現(xiàn)錯(cuò)誤了。這個(gè)就是這篇文檔的關(guān)鍵了。主要就是為了介紹編譯靜態(tài)庫相關(guān)的東西。



          9.可以看到undefine symbols for architecture i386這樣的錯(cuò)誤。

          其實(shí)這個(gè)錯(cuò)誤原因很簡單,就是因?yàn)椋覀冇缅e(cuò)了編譯出來的libUITab.a lib,在模擬器里面,我們需要的是基于i386構(gòu)架編譯的static lib,但是這個(gè)a文件,大家還記得前面說的arm6 arm7構(gòu)架的么。這個(gè)a其實(shí)是在iphone這個(gè)arm構(gòu)架上運(yùn)行的代碼。其實(shí)show in finder指向的是一個(gè)ios device的庫,并不是i386模擬器下的庫。那如何編譯i386的庫呢?看見第二張圖片的Print>IOS Device了么?我們將這個(gè)iOS Device修改成iPhone5.0 Simulator。在進(jìn)行編譯,這樣就可以編譯出i386下面的庫。這個(gè)時(shí)候我們show in finder打開的文件夾還是ios device下的庫。我們最好自己去那個(gè)目錄下看一下。這里我們用command去查看了一下目錄情況,如下:可以看到一個(gè)iphoneos的目錄和一個(gè)simulator的目錄。


          然后我們?cè)倏纯催@個(gè)目錄與第4條所示的目錄有什么不同! 同樣也有一個(gè)libPrint.a文件。



          10.錯(cuò)誤原因分析

          Release-iphoneos里面的是基于arm6 arm7編譯出來的庫文件。Release-iphonesimulator文件夾下面的是基于i386編譯出來的文件。

          11.合并.a文件,制作通用靜態(tài)庫

          這二個(gè)庫一個(gè)是用于真機(jī)運(yùn)行的一個(gè)是用于模擬器運(yùn)行的.其實(shí)我們可以利用lipo將這二個(gè)文件打包成一個(gè)通用的a文件。命令如下:

          /Users/user/Library/Developer/Xcode/DerivedData/UITab-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products替換成你的路徑。 

          /Users/user/Desktop/libPrint.a替換成合并后的路徑。 

          lipo -create /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphonesimulator/libPrint.a  /Users/pjk1129/Library/Developer/Xcode/DerivedData/Print-dgfkluumuexoxhcapzidtsmdgqcj/Build/Products/Release-iphoneos/libPrint.a  -output /Users/pjk1129/Desktop/libPrint.a


          12.打包以后的庫文件,我們查看信息

          然后打入如下命令:lipo -info /Users/pjk1129/Desktop/libPrint.a 

          可以看到如下信息:


          如上,你已經(jīng)看到了,它具備了i386和arm7的條件。 現(xiàn)在我們這個(gè)靜態(tài)庫,支持的構(gòu)架已經(jīng)是armv7 i386了。


          13.ok,經(jīng)過上述步驟后

          這個(gè)通用庫生成后,我們將原來,調(diào)用這個(gè)庫進(jìn)行替換一下,在進(jìn)行編譯,成功編譯,運(yùn)行結(jié)果如下所示:


          posted @ 2012-10-09 18:14 writegull 閱讀(654) | 評(píng)論 (0)編輯 收藏

          three20 wiki 地址:https://github.com/facebook/three20/wiki/Debugging

          You can use Three20's debugging facilities instead of NSLog() / assert(). This would give you an ability to turn off debugging messages without commenting out all NSLog's, sort log messages by importance (errorwarninginfo).

          Turn on debugging(打開調(diào)試)

          These instructions are for Xcode 3:

          • Right-click on project, choose "Get Info".
          • In the "Build" tab, choose "Configuration => Debug" (you probably want to enable this only for debug builds)
          • While in the "Build" tab, search for "Preprocessor Macros" under the "GCC 4.2 - Preprocessing" section.
            • Add a declaration that reads DEBUG. That way you enable debugging in general.
            • Add a declaration that reads TTMAXLOGLEVEL=TTLOGLEVEL_INFO. By doing this, you set the default debugging output to beTTLOGLEVEL_INFO, the most descriptive one.

          Debugging preprocessor macro

          Use debugging

          Logging

          Use these instead of NSLog(). Which level gets printed to the console and which doesn't depends on what's set in preprocessor macros asTTMAXLOGLEVEL (see above).

          TTDERROR(text, ...)    // Log level 1 TTDWARNING(text, ...)  // Log level 3 TTDINFO(text, ...)     // Log level 5 TTDPRINT(text, ...) 

          Example

          If I got this in AppDelegate.m of my project HelloWorld:

          - (void)applicationDidFinishLaunching:(UIApplication *)application {	     TTDINFO(@"Hello!"); } 

          ...the console output would look like this:

          2010-05-15 01:04:20.107 HelloWorld[65222:207] -[AppDelegate applicationDidFinishLaunching:](22): Hello! 

          Conditional logging

          This is a type of logging facility which only outputs something if a particular condition is met:

          TTDCONDITIONLOG(condition, text, ...); 

          Example

          TTDCONDITIONLOG(TTDFLAG_URLREQUEST, @"Request parameters: %@", request.parameters); 

          Debug-only assertions

          Three20 also provides support for assertions which only work in the debug build.

          TTDASSERT(condition_which_would_lead_to_application_termination_when_true); 

          Example

          // Not that implementing safeAddSubview: is a good idea - (void)safeAddSubview:(UIView*)view {     TTDASSERT(nil != view);     if (nil == view) {         return;     }     [self addSubview:view]; } 

          See also

          Links

          posted @ 2012-09-27 10:30 writegull 閱讀(408) | 評(píng)論 (0)編輯 收藏

          翻譯:http://www.joshsunshine.me.uk/2012/02/29/ios-development-remove-old-notifications-from-notification-center.html

          不逐字翻譯了,只是大體說一下。
          看作者的意思,應(yīng)該是他經(jīng)常收到N多通知,而通過其中一條通知打開一個(gè)app以后,發(fā)現(xiàn)那個(gè)app的其它通知還在通知中心。作者不喜歡這樣的情況。我以為我也存在的這樣的情況,馬上檢查了一下,發(fā)現(xiàn)沒有。看來是少數(shù)app的問題。但是也記錄一下。作者總結(jié)的從通知中心移除通知的三種方法:
          1.將app的BadgeNumber設(shè)為0,就是app圖標(biāo)右上角那個(gè)

          [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];


          2.如果BadgeNumber本身就是0的情況,可以先將其設(shè)1再設(shè)置成0

          [[UIApplication sharedApplication] setApplicationIconBadgeNumber:1];
          [[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];

          3.如果以上的辦法都不好使的話,那就用本地通知欺騙一下。

          UIApplication* application = [UIApplication sharedApplication];
          NSArray* scheduledNotifications = [NSArray arrayWithArray:application.scheduledLocalNotifications];
          application.scheduledLocalNotifications = scheduledNotifications;

          就這么多了,我仔細(xì)想了一下,為什么我的應(yīng)用從其中一條通知打開的時(shí)候,其它的通知消失掉:
          因?yàn)槲以诔绦騿?dòng)的時(shí)候就執(zhí)行了第一條:)

          posted @ 2012-09-14 17:51 writegull 閱讀(2760) | 評(píng)論 (0)編輯 收藏

          使用MFMessageComposeViewController 編寫發(fā)短信模塊時(shí)界面是英文的情況下,用下面的方法可以解決問題

          在plist里面Localization native development region 選擇 china ,然后Localized resources can be mixed 選 YES,如果沒有Localized resources can be mixed,需手動(dòng)添加
          posted @ 2012-09-10 18:12 writegull 閱讀(709) | 評(píng)論 (0)編輯 收藏

          1.圖標(biāo)的圓角效果是系統(tǒng)自動(dòng)加上的。

          2.光暈效果雖然也是系統(tǒng)加上的,但可以通過程序中設(shè)置參數(shù)來去掉內(nèi)建光暈效果。

          方法:在info.plist里面添加一條記錄UIPrerenderedIcon,新版的XCODE 會(huì)自動(dòng)識(shí)別為Icon already includes gloss effects 打上勾就OK了。如果沒有識(shí)別的右邊欄寫上YES就可以

          posted @ 2012-07-31 14:06 writegull 閱讀(633) | 評(píng)論 (0)編輯 收藏

               摘要:   閱讀全文
          posted @ 2012-07-25 11:14 writegull 閱讀(1980) | 評(píng)論 (1)編輯 收藏

          原文地址:http://blog.itotem.com.cn/?p=22

          - alloc, copy, retain會(huì)把引用計(jì)數(shù)+1

          - release會(huì)把引用計(jì)數(shù)-1

          - 局部變量如果初始化時(shí)不是autorelease的,要及時(shí)調(diào)用release釋放,并且賦值為nil否則引用仍然存在導(dǎo)致下次無法用nil做是否有值的判斷

          - 實(shí)例變量要在每次賦值時(shí)要先釋放當(dāng)前引用的對(duì)象再賦值,并retain一下保證引用計(jì)數(shù)為1

          - 對(duì)于有retain參數(shù)的property,直接使用”.”賦值時(shí)系統(tǒng)會(huì)自動(dòng)釋放當(dāng)前引用對(duì)象再賦值,并自動(dòng)retain一下

          - dealloc中要對(duì)所有實(shí)例變量調(diào)用release,對(duì)于有retain參數(shù)的property只需要調(diào)用self.theProperty = nil即可,系統(tǒng)會(huì)去做釋放

          - delegate的property通常設(shè)為assign,如果設(shè)為retain的話會(huì)有循環(huán)引用的問題,比如aView.delegate = self時(shí)會(huì)把self retain一下,在aView的dealloc中會(huì)把delegate release,但是由于self的引用永遠(yuǎn)不會(huì)小于1,所以導(dǎo)致aView和self的dealloc永遠(yuǎn)都不會(huì)被執(zhí)行,都永遠(yuǎn)駐留內(nèi)存造成泄露。所以如果要設(shè)為retain的話一定要確保不會(huì)造成循環(huán)引用問題。

          - 在UIViewController中的viewDidUnload中要釋放掉局部變量,調(diào)用release并設(shè)為nil,有時(shí)系統(tǒng)收到內(nèi)存警告時(shí)會(huì)自動(dòng)調(diào)用這個(gè)函數(shù)來釋放一些內(nèi)存空間

          - 系統(tǒng)內(nèi)存警告的回調(diào)中要釋放掉內(nèi)存中的緩存和其他可釋放的東西,以免造成crash

          - 使用UITableView時(shí)要把cell設(shè)置為重用的,并且要確保確實(shí)寫得是重用的,有的人寫完的結(jié)果相當(dāng)于還是每次都重建cell,導(dǎo)致效率低下

          - 使用UIScrollView時(shí)要自己控制釋放掉目前不顯示的內(nèi)容,尤其是圖片,考慮圖片大小和瀏覽效果可以加載當(dāng)前顯示頁兩邊的3-5頁內(nèi)容

          - 圖片需要做緩存,尤其是本地文件系統(tǒng)緩存,可以放到Library/Cache目錄中,這個(gè)目錄系統(tǒng)有專用的常量來獲取,比如:

          這里是一個(gè)小例子闡釋前幾條基本原則:

          1
          2
          3
          4
          5
          6
          7
          8
          9
          10
          11
          12
          13
          14
          15
          16
          17
          18
          19
          20
          21
          22
          23
          24
          25
          26
          27
          28
          29
          30
          31
          32
          33
          34
          35
          - (void)aFunction{
          //創(chuàng)建一個(gè)局部變量view
          UIView *view = [[UIView alloc] init];
          // 賦值給實(shí)例變量theView
          [theView release]; //先釋放一下當(dāng)前引用的變量
          theView = [view retain]; //給實(shí)例變量賦值時(shí)需要retain一下
          // 如果theView是一個(gè)有retain屬性的property
          self.theView = view; //不需要先釋放,也不需要調(diào)用retain,系統(tǒng)會(huì)自動(dòng)做,所以一定不能這樣寫self.view = [[UIView alloc] init];,這樣的話創(chuàng)建的view會(huì)被retain兩次,造成泄露,對(duì)于這種可以先創(chuàng)建一個(gè)局部變量,給self.view賦值后再釋放
          [view release]; //要及時(shí)釋放局部變量
          }
          - (void)dealloc{
          //釋放局部變量
          [theView release];
          //如果theView是一個(gè)有retain屬性的property,也可以這樣寫
          self.theView = nil;
          [super dealloc];
          }
          posted @ 2012-07-05 17:05 writegull 閱讀(1250) | 評(píng)論 (1)編輯 收藏

          今天測試程序時(shí)發(fā)現(xiàn)一個(gè)奇怪的現(xiàn)象,我在關(guān)于頁面中想顯示圖片icon文件,可是怎么調(diào)試都不顯示。后來加載其它圖片則顯示正常。

          我分析原因是蘋果對(duì)程序訪問icon文件做了限制,所以不能正常顯示

          解決方案:把icon文件復(fù)制一份,改成其它名字,加載改名字的文件,問題成功解決!
          posted @ 2012-06-26 16:10 writegull 閱讀(361) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 呼图壁县| 罗田县| 英吉沙县| 阜阳市| 喀什市| 精河县| 化州市| 长兴县| 林周县| 崇礼县| 吉安县| 尉犁县| 尖扎县| 承德市| 普兰店市| 紫金县| 年辖:市辖区| 双鸭山市| 剑川县| 台北县| 新竹市| 朝阳区| 伊宁市| 千阳县| 舞钢市| 东兰县| 中牟县| 富阳市| 永登县| 漳州市| 六枝特区| 胶南市| 通化县| 湘乡市| 女性| 天台县| 五指山市| 西吉县| 龙岩市| 中牟县| 渑池县|