我想在NSObject实例上使用选择器,而不需要实现协议.例如,如果调用它的NSObject实例支持它,则应该设置一个类别方法.这是代码,代码按预期工作:
if ([self respondsToSelector:@selector(setError:)])
{
[self performSelector:@selector(setError:) withObject:[NSError errorWithDomain:@"SomeDomain" code:1 userInfo:nil]];
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器看不到setError:signature的任何方法,因此它为包含该@selector(setError:)代码段的每一行提供了警告:
Undeclared selector 'setError:'
Run Code Online (Sandbox Code Playgroud)
我不想声明一个协议来摆脱这个警告,因为我不希望所有可能使用它的类实现任何特殊的东西.按惯例,我希望他们有setError:方法或财产.
这可行吗?怎么样?
干杯,
EP
我是一个iOS新手.我有一个选择器方法如下 -
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second
{
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试实现这样的东西 -
[self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second" afterDelay:15.0];
Run Code Online (Sandbox Code Playgroud)
但这给了我一个错误说 -
Instance method -performSelector:withObject:withObject:afterDelay: not found
Run Code Online (Sandbox Code Playgroud)
关于我缺少什么的任何想法?
我只是想知道是否有办法调用一个方法,我用一个字符串动态建立方法的名称.
例如,我有一个名为loaddata的方法
-(void)loadData;
Run Code Online (Sandbox Code Playgroud)
打电话给我,我通常称之为
[self loadData];
Run Code Online (Sandbox Code Playgroud)
但我希望能够用字符串动态调用它,例如
NSString *methodName = [[NSString alloc] initWithString:@"loadData"];
[self methodName];
Run Code Online (Sandbox Code Playgroud)
这是一个愚蠢的例子,但我希望你明白我的观点.我正在使用它来为我为我的IPad应用程序设置的数据绑定类.很难解释,但要解决它我需要弄清楚如何用字符串调用方法.
有任何想法吗?
谢谢
当我在模拟器中运行我的应用程序时,我在控制台中获取此日志.在iOS 8中没有看到这个.我不太清楚是什么导致了这一点.有没有其他人遇到同样的问题,如果是这样,它是如何解决的?或者是否有人可以提供任何帮助?
多年来我一直在关注一个名为Target-Action的伟大模式,如下所示:
当调用时,对象在指定的目标对象上调用指定的选择器.这在需要对任意方法进行简单回调的许多不同情况下非常有用.
这是一个例子:
- (void)itemLoaded {
[specifiedReceiver performSelector:specifiedSelector];
}
Run Code Online (Sandbox Code Playgroud)
在ARC下,现在发现做这样的事情突然变得危险.
Xcode会发出如下警告:
PerformSelector可能导致泄漏,因为其选择器未知
当然,选择器是未知的,因为作为Target-Action设计模式的一部分,您可以指定您想要的任何选择器,以便在发生有趣的事情时接听电话.
这个警告最让我感到困惑的是它说可能存在潜在的内存泄漏.根据我的理解,ARC不会弯曲内存管理规则,而只是在正确的位置自动插入retain/release/autorelease消息.
另外需要注意的是:-performSelector:确实有一个id返回值.ARC分析方法签名,以便在方法返回+1保留计数对象时通过应用命名约定来确定.在这种情况下,ARC不知道选择器是-newFooBar工厂还是只是调用一个不可靠的工作方法(无论如何,这几乎都是Target-Action的情况).实际上,ARC应该已经认识到我不期望返回值,因此忘记任何可能的+1保留计数返回值.从这个角度来看,我可以看到ARC的来源,但仍然存在太多关于这在实践中意味着什么的不确定性.
这现在是否意味着在ARC下会出现一些错误,如果没有ARC,这种错 我不知道这会如何产生内存泄漏.有人可以举出这样做危险的情况,以及在这种情况下如何创建泄漏?
我真的用谷歌搜索了互联网,但没有发现任何网站解释原因.
xcode memory-management objective-c ios automatic-ref-counting
我做了一个NSDictionary来将我的输入(NSString)转换为选择器."选择器地图"看起来如下:
[self setCmdSelectorMap:[NSDictionary dictionaryWithObjectsAndKeys:
[NSValue valueWithPointer:@selector(doOpenBrowserByString:)], @"openBrowser",
[NSValue valueWithPointer:@selector(syncData:)], @"sync",
[NSValue valueWithPointer:@selector(getCachedString:)], @"getCachedString",
nil]];
Run Code Online (Sandbox Code Playgroud)
当我尝试获取其中一个选择器并按如下方式执行时,它会引发警告:
sel = [[_cmdMap objectForKey:command] pointerValue];
NSLog(@"selector determined : %@", NSStringFromSelector(sel));
[self performSelector:sel withObject:arguments];
Run Code Online (Sandbox Code Playgroud)
警告说:PerformSelector可能导致泄漏,因为它的选择器未知.有没有办法防止这种警告发生?或者是否有任何"更安全"的方式来执行此类操作?
多谢你们 :)
我正在尝试使用Xcode5升级我的应用程序,但在第三方库(MagicalRecord)中遇到了许多"语义问题"."修复"这个的最快方法可能是使用:
#pragma GCC diagnostic ignored "-Wundeclared-selector"
Run Code Online (Sandbox Code Playgroud)
(来自:如何摆脱'未声明的选择器'警告)
编译器指令,但我的直觉说这不是这样做的合适方式.带有上述错误的小代码示例:
+ (NSEntityDescription *) MR_entityDescriptionInContext:(NSManagedObjectContext *)context {
if ([self respondsToSelector:@selector(entityInManagedObjectContext:)])
{
NSEntityDescription *entity = [self performSelector:@selector(entityInManagedObjectContext:) withObject:context];
return entity;
}
else
{
NSString *entityName = [self MR_entityName];
return [NSEntityDescription entityForName:entityName inManagedObjectContext:context];
}
}
Run Code Online (Sandbox Code Playgroud)
其中entityInManagedObjectContext:没有定义方法的地方.
有关如何最好地解决这些类型的错误的任何建议,提前谢谢?!
假设我在obj c中有如下的警报视图
UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"title" message:@"szMsg" delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:@"download"];
[alert show];
[alert release];
Run Code Online (Sandbox Code Playgroud)
现在我们在警报视图上有2个按钮(确定并下载),如何为下载一个编写事件处理程序?
我想创建一个这样的方法:
- (void) checkAndUpdateStringProperty: (NSString **) property{
if (...)
*property = @"whatever";
}
Run Code Online (Sandbox Code Playgroud)
我想用它来传递同一个类的属性:
- (void) somewhereElse{
....
[self checkAndUpdateStringProperty: &self.productName];
}
Run Code Online (Sandbox Code Playgroud)
但这会产生语法错误,说"请求的属性表达式的地址".有什么理由吗?如果我用局部变量替换class属性,它可以正常工作:
- (void) somewhereElse{
NSString *name = nil;
[self checkAndUpdateStringProperty: &name];
}
Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的按钮类,如下所示:
@interface MyButton : NSObject {
id object;
SEL action;
}
@property(strong) id object;
@property SEL action;
-(void)fire;
@end
@implementation MyButton
@synthesize object, action;
-(void)fire {
[object performSelector:action];
}
@end
Run Code Online (Sandbox Code Playgroud)
我从Clang得到以下警告[object performSelector:action]:
PerformSelector may cause a leak because its selector is unknown
Run Code Online (Sandbox Code Playgroud)
经过一些研究后,我发现选择器可以属于具有不同内存要求的系列.目的是使行动失效,因此不应引起任何ARC困难并且应该适合none家庭.
它看起来像我想要的相关预处理器代码片段,或者是以下的变体:
__attribute__((objc_method_family(none)))
Run Code Online (Sandbox Code Playgroud)
但是我在哪里告诉Clang不要担心?
objective-c ×7
ios ×5
iphone ×3
selector ×3
categories ×1
clang ×1
cocoa ×1
dynamic ×1
ios9 ×1
macos ×1
messaging ×1
methods ×1
semantics ×1
uialertview ×1
xcode ×1
xcode5 ×1
xcode7-beta4 ×1