注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

WA!Peter

广州天河, 香港火炭,深圳罗湖, 北京国贸

 
 
 

日志

 
 

retain vs copy, class runtime dynamics  

2009-10-27 19:33:13|  分类: iphone |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

Objective-C runtime reference:
http://developer.apple.com/mac/library/documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

class_getClassMethod
Method class_getClassMethod(Class aClass, SEL aSelector)
問題: selector 怎樣取得?
答案: SEL selector = sel_registerName("testMethod1"); // must be C string!
note:
#import <objc/runtime.h>

////////////// START: the following code execute + testXXX method in a class //////

SEL selector;

Class myClass;

unsigned int count;  // note this is for getting the number of method


myClass = [self class];


Method * methodList;  //  note: need to free !

methodList = class_copyMethodList(object_getClass(myClass), &count);

// methodList = class_copyMethodList(myClass, &count);  

// using "myClass" directly will get instance method list


NSLog(@"method count = %d", count);

for (int i=0; i<count; i++) {

const char * name;

selector = method_getName(methodList[i]);

name = sel_getName(selector);

NSLog(@"method %d name: %s", i, name); 

// run it if it start with "test"

if (strncmp("test", name, 4)==0)  {

objc_msgSend(myClass, selector);  

}

}


free(methodList);

////////////// END  cut here, by peter  /////////////////////////////////



------------------------------------------------------------------------------------------------------------------------------
retain vs copy 的實際操作:
http://blog.andrewpaulsimmons.com/2008/08/property-and-assign-retain-copy.html
假設:  myObject.monkey = newValue;
@property (nonatomic, retain) MonkeyClass monkey;

monkeyClass.monkey = newValue; 
// is equivalent: [monkeyClass setMonkey:newValue];
- (void)setMonkey(id newValue) {
/// @synthesis auto generate logic like this:
if (monkey != newValue)
{
    [monkey release];
    monkey = [newValue retain];
}
}

@property (nonatomic, copy) MonkeyClass monkey;
if (monkey != newValue)
{
    [monkey release];
    monkey = [newValue copy];  // note: this create a "new" copy, like alloc
}

補充:
假設 monkey 使用了 retain property:
MonkeyClass  * mc = [[MonkeyClass alloc] init];
NSString *str = [[NSString alloc] init];
mc.monkey = str;     // after:  [str retainCount]  = 2
mc.monkey = nil;      // after:  [str retainCount] = 1   因為 原有保存在monkey的 str 做了 release!
所以, 如果要清理 str, 只要多一次 [str release] 就可以了

  评论这张
 
阅读(251)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017