作者zonble (zonble)
看板MacDev
标题Re: [问题] class method
时间Mon Oct 25 00:10:01 2010
※ 引述《Gsus (肉元,吉米,助教)》之铭言:
: 推 hothero:nsobject的performSelectorInBackground就只能用void吗? 10/24 17:30
先回答其中一半的问题好了:如果另外一个 method 只能回传
void,有什麽办法,可以让 method 里头处理完的资料传出来?
大概有几种作法,第一种方法是用指标:
- (void)myMethodWithString:(NSString *)inString
outString:(NSString **)outString
{
/// 看想要对 inString 做什麽
*outString = @"Hi";
}
NSString *inString = nil;
NSString *outString = nil;
[self myMethodWithString:inString outString:&outString];
NSLog(@"outString:%@", outString);
另外一种作法是用 block:
- (void)myMethodWithString:(NSString *)inString
completeBlock:(void (^)(NSString *))myBlock
{
myBlock(@"Hi");
}
NSString *inString = nil;
__block NSString *outString = nil; // 注意,在 block 中,如果想要使用
// 外面的变数,就需要这样宣告
[self myMethodWithString:nil completeBlock:^(NSString *string) {
outString = [string retain];
}];
NSLog(@"outString:%@", outString);
另外就是当做 C 来写:
void myFunction(NSString *inString) {
NSLog(@"inString:%@", inString);
}
- (void)myMethodWithString:(NSString *)inString
completeFunction:(void *)inFunction
{
void (* myFunc)(NSString *);
myFunc = (void *)inFunction;
myFunc(@"Hi");
}
NSString *inString = nil;
[self myMethodWithString:inString completeFunction:myFunction];
基本上,如果是要给 performSelectorInBackground 用的话,大概
第一种与第三种作法都不太行,因为 performSelectorInBackground:
withObject: 後面只能够传一个 ObjC 物件,如果要传多个参数的话
通常会包在一个 NSArray 里头,但是 NSArray 只能够加入 ObjC 物件。
(换句话说,block 是可以当成 ObjC 物件的)
而第一种作法做大的问题是,在另外一个 method 里头,并没有回来
告诉你,要做的事情到底做完了没有。
所以,如果不想管比较旧的作业系统,就放心大胆的用 block,要不
然,就是安排一个 delegate。
--
zonble.net
cocoa.zonble.net
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.44.189.129
1F:推 Gsus:那问一下~ 前面所提到的没有call by ref是什麽意思呢? 10/25 00:30
2F:推 Gsus:是指int, float这种没有罗~ 10/25 00:54
3F:推 Gsus:我错了QQ 所以obj-c没有call by ref这件事是指什麽呢QQ 10/25 01:02