相关疑难解决方法(0)

如何摆脱'未声明的选择器'警告

我想在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

objective-c selector categories

160
推荐指数
6
解决办法
7万
查看次数

iOS - 如何使用多个参数和afterDelay实现performSelector?

我是一个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)

关于我缺少什么的任何想法?

iphone selector ios performselector

89
推荐指数
6
解决办法
9万
查看次数

Objective C使用字符串动态调用方法

我只是想知道是否有办法调用一个方法,我用一个字符串动态建立方法的名称.

例如,我有一个名为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应用程序设置的数据绑定类.很难解释,但要解决它我需要弄清楚如何用字符串调用方法.

有任何想法吗?

谢谢

iphone methods messaging dynamic objective-c

72
推荐指数
2
解决办法
3万
查看次数

此应用程序正在从后台线程修改autolayout引擎,这可能导致引擎损坏和奇怪的崩溃

当我在模拟器中运行我的应用程序时,我在控制台中获取此日志.在iOS 8中没有看到这个.我不太清楚是什么导致了这一点.有没有其他人遇到同样的问题,如果是这样,它是如何解决的?或者是否有人可以提供任何帮助?

iphone ios9 xcode7-beta4

36
推荐指数
3
解决办法
4万
查看次数

在ARC下,Target-Action设计模式是不是很糟糕?

多年来我一直在关注一个名为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

35
推荐指数
2
解决办法
2773
查看次数

防止警告"PerformSelect可能导致泄漏,因为它的选择器未知"

可能重复:
performSelector可能导致泄漏,因为其选择器未知

我做了一个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可能导致泄漏,因为它的选择器未知.有没有办法防止这种警告发生?或者是否有任何"更安全"的方式来执行此类操作?

多谢你们 :)

macos objective-c ios

34
推荐指数
1
解决办法
2万
查看次数

我应该修复Xcode 5'语义问题:未声明的选择器'吗?

我正在尝试使用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:没有定义方法的地方.

有关如何最好地解决这些类型的错误的任何建议,提前谢谢?!

selector ios xcode5 semantics

31
推荐指数
4
解决办法
2万
查看次数

如何在UIAlertView中为按钮编写事件处理程序?

假设我在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个按钮(确定并下载),如何为下载一个编写事件处理程序?

objective-c uialertview ios

22
推荐指数
2
解决办法
4万
查看次数

objective-c:不允许双重指向属性?

我想创建一个这样的方法:

- (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)

cocoa objective-c

20
推荐指数
3
解决办法
1万
查看次数

我正在使用ARC在Objective-C中编写一个Button类 - 如何在选择器上阻止Clang的内存泄漏警告?

我正在编写一个简单的按钮类,如下所示:

@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 clang automatic-ref-counting

19
推荐指数
3
解决办法
4593
查看次数