当前位置:  编程技术>移动开发
本页文章导读:
    ▪property跟_property的一些小结        property和_property的一些小结   在.h文件中: @interface MyClass:NSObject {       MyObjecct *_myObject; } @property(nonamtic, retain) MyObjecct *myObject; @end   在.m文件中 @implementation MyClass   @synthesize myObject=_myObje.........
    ▪ 音乐播发        音乐播放 package com.android.andrew;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.Activity;import android.content.Intent;import android.net.Uri;import android.os.Bundle;import.........
    ▪ onFling为啥执行不到       onFling为什么执行不到 因为onDown方法return了false,导致依赖于onDown的onFling无法被触发。 改成return true 就可以啦! ......

[1]property跟_property的一些小结
    来源: 互联网  发布时间: 2014-02-18
property和_property的一些小结

 

在.h文件中:

@interface MyClass:NSObject

{

      MyObjecct *_myObject;

}

@property(nonamtic, retain) MyObjecct *myObject;

@end

 

在.m文件中

@implementation MyClass

 

@synthesize myObject=_myObject;

 

 

- (void)dealloc

{

    [_myObject release];

    [super dealloc];

}

 

@end


通过最近google了一些文章,如果大家观后有自己看法希望能留言
_myObject是实例变量,相当于C++中self->myObject
self.myObject相当于[self myObject];是一个消息,也有说是属性
http://stackoverflow.com/questions/5466496/why-rename-synthesized-properties-in-ios-with-leading-underscores

myObject和_myObject是用来区别实例变量消息。一般来说,应该使用setter和getter的属性,而不是直接访问实例变量。
当你写一个setter方法,该方法不能自身使用setter,否则你会产生无限递归,并且发生崩溃。setter调用自身,再次调用自身,直到堆栈溢出。
http://www.iphonedevsdk.com/forum/iphone-sdk-development/98273-feeling-confused-about-_property-and-property.html

写成这样:
@interface MyClass
@property (nonatomic, retain) NSString* myProperty;
- (NSString*)someOtherMethod;
@end

@implementation MyClass
@synthesize myProperty = _myProperty; // setter and ivar are created automatically

- (NSString*)myProperty {
    return [_myProperty stringByAppendingString:@" Tricky."];
}

- (NSString*)someOtherMethod {
    return [self myProperty];
}
http://stackoverflow.com/questions/9541828/property-and-setters-and-getters

http://stackoverflow.com/questions/4172810/what-is-the-difference-between-ivars-and-properties-in-objective-c



1 楼 白色蜻蜓 2012-09-05  
建议在dealloc中  [_myObject release]之后加一个  _myObject =nil 效果更好
2 楼 synchronized_lala 2012-09-05  
白色蜻蜓 写道
建议在dealloc中  [_myObject release]之后加一个  _myObject =nil 效果更好

谢谢,不过就是我其实不太懂,因为我google的时候有的人说加self.myObject比较好,有的说不用,加了反倒有问题(是英文写得,且没有其他语言的例子,我不能很好的迁移,不是很理解),你这边又说加_myObject比较好。能不能给我具体说说原因呀
3 楼 白色蜻蜓 2012-09-07  
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助
4 楼 synchronized_lala 2012-09-08  
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助





嗯嗯,有帮助,因为oc的知识点没有系统学过,所以对你一开始的话不是很理解,现在看了一点,总算是有进步啊。还有虽然对在dealloc中加_myObject =nil来直接将其引用基数归0,我理解了,但是还没有代码上的体会。我要继续努力。O(∩_∩)O谢谢!
5 楼 synchronized_lala 2012-09-09  
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。
6 楼 白色蜻蜓 2012-09-10  
synchronized_lala 写道
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。

不错,大体理解上没有任何问题,对此做出以下几点补充
1、你可以用[self.student retainCount]打印出引用基数可以看到该基数的确切数值,当然,很熟练就没有必要了。
2、针对你的第二条,这个不加self的sutdent应该是你定义了变量,但是没有对其添加@property 和@synthesize吧。总之,你alloc了一下,又release了一下,基数归0,就不能再引用了,如非要这样可以[student retain]一下 即可调用
3、对于你说的第三条我们一般都这样操作self.student =[ [[Student alloc] init] autoreleae]; 这样autorelease一下,就不会泄漏了。
4、总之,有alloc、copy、retain的地方你就肯定要用一个release或者autorelease与相对应,这就是oc内存管理的黄金法则,当然了,切实的体会还需在代码中多多练习。

--希望对你有帮助,有疑惑得地方再行讨论。
7 楼 synchronized_lala 2012-09-11  
白色蜻蜓 写道
synchronized_lala 写道
白色蜻蜓 写道
myObject=_myObject,前者是引用,后者是内存。
在init和dealloc方法中最好用_myObject,因为这样直接初始化或销毁内存,比self.myObject这样调用引用要效率高,
在其他方法中就self.myObject调用引用进行操作了。
至于建议在dealloc中加_myObject =nil就是在销毁的时候直接将其引用基数归0,就是回收内存嘛,呵呵



--希望对你有帮助




问下下面的解释对吗?今天看到的觉得好像懂了一些
1、加self的方式:
Student *mystudent = [[Student alloc] init];      //mystudent 对象 retainCount = 1;
self.student = mystudent;   //student 对象 retainCount = 2;
[mystudent release];  //student 对象 retainCount = 1;
retainCount指对象引用计数,student的property 是retain 默认使用self.student引用计数+1。
2、不加self的方式
Student *mystudent = [[Student alloc] init];       //mystudent 对象 retainCount = 1;
student = mystudent;   //student 对象 retainCount = 1;
[mystudent release];   //student 对象内存已释放,如果调用,会有异常
3、加self直接赋值方式
self.student = [[Student alloc] init]; //student 对象 retainCount = 2;容易造成内存泄露
由于objective-c内存管理是根据引用计数处理的,当一个对象的引用计数为零时,gcc才会释放该内存。

不错,大体理解上没有任何问题,对此做出以下几点补充
1、你可以用[self.student retainCount]打印出引用基数可以看到该基数的确切数值,当然,很熟练就没有必要了。
2、针对你的第二条,这个不加self的sutdent应该是你定义了变量,但是没有对其添加@property 和@synthesize吧。总之,你alloc了一下,又release了一下,基数归0,就不能再引用了,如非要这样可以[student retain]一下 即可调用
3、对于你说的第三条我们一般都这样操作self.student =[ [[Student alloc] init] autoreleae]; 这样autorelease一下,就不会泄漏了。
4、总之,有alloc、copy、retain的地方你就肯定要用一个release或者autorelease与相对应,这就是oc内存管理的黄金法则,当然了,切实的体会还需在代码中多多练习。

--希望对你有帮助,有疑惑得地方再行讨论。









嗯嗯,retainCount我试了一下,挺好用的,还有你之前说的_object = nil;我也改过来了,非常感谢啊!(*^__^*) 嘻嘻……

    
[2] 音乐播发
    来源: 互联网  发布时间: 2014-02-18
音乐播放
package com.android.andrew;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.AdapterView.OnItemClickListener;

public class AndroidMusicActivity extends Activity implements OnItemClickListener{
    /** Called when the activity is first created. */

private String TAG = "Music";

private String[] title = {
"MUSIC-01",
"MUSIC-02",
"MUSIC-03",
"MUSIC-04",
"MUSIC-05",
"MUSIC-06",
"MUSIC-07",
"MUSIC-08",
"MUSIC-09",
"MUSIC-10",
};

private String[] addr = {
"http://zhangmenshiting2.baidu.com/data2/music/13764893/13764893.mp3?xcode=d0f73ca2ecfc6d410d7b4b9a27aa30f1&mid=0.57743919005883/忍不住原谅.mp3",
"http://web.kugou.com/?action=single&filename=%u4F55%u665F%u94ED__-__%u4F5B%u8BF4%u3010%u5BAB%u9501%u73E0%u5E18%u7247%u5C3E%u66F2%u3011&hash=f833c4ccb5ad5324a3fa94c0918124a8&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u848B%u6BC5__-__%u9000%u4E0D%u56DE%u3010%u4EB2%u7231%u7684%u56DE%u5BB6%u63D2%u66F2%u3011&hash=a3162bb54a5f06341a7058e79e4207a0&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u5355%u8272%u51CC__-__%u5355%u8272%u51B0%u6DC7%u51CC&hash=7ab7e9510ba387ff93a7cdc8d72cc204&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u963F%u6084__-__%u5982%u679C%u8FD9%u662F%u7231%u3010%u592B%u59BB%u90A3%u4E9B%u4E8B%u63D2%u66F2%u3011&hash=333bf2680b23f163f0abd3eb8745083c&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u5C0F%u6C88%u9633__-__%u6211%u7684%u773C%u6CEA%u4E3A%u8C01%u98DE%u3010%u602A%u4FA0%u6B27%u9633%u5FB7%u7247%u5C3E%u66F2%u3011&hash=0073959337325f0fabc09d2f5073623d&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u6C88%u6625%u9633__-__%u6A31%u6843%u7EA2%u3010%u6A31%u6843%u4E3B%u9898%u66F2%u3011&hash=0197813ee3ce9ea79903985799107c23&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u9648%u695A%u751F%u3001%u4F55%u6D01__-__%u7ECF%u8FC7%u3010%u592B%u59BB%u90A3%u4E9B%u4E8B%u4E3B%u9898%u66F2%u3011&hash=e9525ab9d34d4e7f655337d28c224aa8&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u51B7%u6F20__-__%u7231%u4E0D%u518D%u6765&hash=100b82bd15944aad72a461480886aff6&timelen=0&microblog=1&chl=kugou",
"http://web.kugou.com/?action=single&filename=%u4E00%u52A0%u4E00%u7EC4%u5408__-__%u6700%u6DF1%u7684%u75DB%u3010%u4EB2%u7231%u7684%u56DE%u5BB6%u63D2%u66F2%u3011&hash=a091abfe771fcde1f8b2f03db6f579c0&timelen=0&microblog=1&chl=kugou",
};

List<Map<String, Object>> list;
private final String TITLE_STR = "title";
private final String ADDR_STR = "addr";

private Uri uri;

private List<Map<String,Object>> getDate(){
list = new ArrayList<Map<String,Object>>();
for(int i=0;i<addr.length;i++){
Map<String,Object> item = new HashMap<String,Object>();
item.put(TITLE_STR,title[i]);
item.put(ADDR_STR, addr[i]);
list.add(item);

}
return list;
}

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        getDate();
       
        ListView itemlist = (ListView) findViewById(R.id.list);
        SimpleAdapter adapter = new SimpleAdapter(this,(List<Map<String, Object>>)list,
        R.layout.main, new String[] {TITLE_STR,null },
       new int[] {R.id.text1 ,R.id.text2});
            itemlist.setAdapter(adapter);
           
            itemlist.setOnItemClickListener(this); 
        itemlist.setSelection(0);
    }
   
    public void onItemClick(AdapterView parent, View v, int position, long id) {
   
    Map map = (HashMap) parent.getAdapter().getItem(position);
    String Addr =  (String) map.get(ADDR_STR);

    Intent  intent = new Intent(Intent.ACTION_VIEW);
            
            Uri uri = Uri.parse(Addr);
        
    intent.setData(uri);
    intent.setClassName("com.android.music", "com.android.music.MediaPlaybackActivity");
    startActivity(intent);
   
    }
}

    
[3] onFling为啥执行不到
    来源: 互联网  发布时间: 2014-02-18
onFling为什么执行不到

因为onDown方法return了false,导致依赖于onDown的onFling无法被触发。

改成return true 就可以啦!


    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android提高之自定义Menu(TabMenu)实现方法 iis7站长之家
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
▪根据USER-AGENT判断手机类型并跳转到相应的app...
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3